FakeItEasy - 伪造 setter 行为来存储一个值然后 getter

FakeItEasy - faking setter behaviour to store a value and then getter

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

    [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.[=19= 时 return 编辑的内容]

为了在 Property getter 被调用时 return backingString 的值 ,你想要ReturnsLazily.

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

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