c# - FakeItEasy - 伪造 setter 行为来存储值,然后存储 getter

标签 c# unit-testing mocking fakeiteasy

最终我想要一个带有 setter 的内部接口(interface)和带有 getter 的公共(public)接口(interface)。复制此场景的代码粗略如下:

    [TestMethod]
    public void TestMethod3()
    {
        var fake1 = A.Fake<IInterface1>(a => a.Implements(typeof(IInterface2)));

        string backingString = null;

        IInterface2 fake2 = (IInterface2)fake1;
        A.CallTo(fake1)
            .Where(a => a.Method.Name.Equals("set_Property"))
            .Invokes((string param) => { backingString = param; });
        A.CallTo(fake1)
            .Where(a => a.Method.Name.Equals("get_Property"))
            .WithReturnType<string>().Returns(backingString); //doesn't work

        A.CallTo(fake2)
            .Where(a => a.Method.Name.Equals("set_Property"))
            .Invokes((string param) => { backingString = param; });
        A.CallTo(fake2)
            .Where(a => a.Method.Name.Equals("get_Property"))
            .WithReturnType<string>().Returns(backingString); //doesn't work

        fake1.Property = "asdf";


        Assert.AreEqual("asdf", fake1.Property); //fails -> fake1.Property is null
        Assert.AreEqual(fake1.Property, fake2.Property); //fails -> fake2.Property is null
    }
}

public interface IInterface1
{
    string Property { get; set; }
}

public interface IInterface2
{
    string Property { get; }
}

我可以尽可能使用 backingString 来存储 setter,但是在设置 getter 时,它无法按照我想要的方式工作。

我还尝试了 A.CallTo(() => fake1.Property).Returns(backingString) 行中的某些内容,但无济于事。

非常感谢专家的帮助:)

最佳答案

当您设置时

A.CallTo(fake1)
    .Where(a => a.Method.Name.Equals("get_Property"))
    .WithReturnType<string>().Returns(backingString);

(对于 fake2 也类似),

backingString 的值为 null,因此这就是稍后访问 Property getter 时返回的值。

为了在调用 Property getter 时返回 backingString 的值,您需要 ReturnsLazily .

在每个地方进行此更改并且测试通过:

A.CallTo(fake1)
    .Where(a => a.Method.Name.Equals("get_Property"))
    .WithReturnType<string>().ReturnsLazily(() => backingString);

关于c# - FakeItEasy - 伪造 setter 行为来存储值,然后存储 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32489566/

相关文章:

java - 模拟封装集合的对象

python - 我如何在我的 Django 应用程序中模拟一个到达外部服务的组件?

c# - 如何确定字符串是希伯来日期还是公历日期?

javascript - 如何从 c# ext.net 调用 javascript

c# - 使用 xUnit 和 asp.net core 测试我的服务

javascript - Chai 希望 .to.throw(Error) 无法按预期工作

c# - NUnit 用于类库的集成测试

c# - Moq - 设置 .Equals 方法返回 false

python - Django override_settings 不适用于运行多个测试

java - Kotlin/Java - 测试数据库数据提供的 REST API