最终我想要一个带有 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/