我第一次使用FakeItEasy来模拟复杂的数据结构。在模拟对象并设置这样的属性时,proprety不会更新。它总是错误的。
var @object = A.Fake<MyObject>();
@object.MyBooleanProperty= true;
阅读有关FakeItEasy的文档,一个例子表明可以做到这一点:
var @object= A.Fake<MyObject>();
A.CallToSet(() => @object.MyBooleanProperty).To(true);
这里的问题是该属性未标记为虚拟,这将抛出FakeConfiguredException
消息:
The current proxy generator can not intercept the specified method for the following reason:
- Non virtual methods can not be intercepted.
关于如何实现这一目标的任何想法?提前致谢。
答案 0 :(得分:4)
如果属性不是虚拟的,那么执行@object.MyBooleanProperty= true
只会调用MyObject
实现,因为FakeItEasy(和其他模拟框架)只能拦截虚拟成员。因此,如果该属性在设置为true后仍为false,则必须是因为它在MyObject
中的实现方式。 FakeItEasy并不参与其中。
至于此:
A.CallToSet(() => @object.MyBooleanProperty).To(true);
这仅仅意味着MyBooleanProperty
在@object
设置为真时。它没有做任何事情,因为你没有指定行为(Invokes
,Throws
,CallsBaseMethod
...)。为了帮助检测此类问题,请考虑使用FakeItEasy.Analyzer(可用on NuGet),它会提醒您未使用的呼叫规范和其他常见错误。
此外,A.CallToSet
仅用于配置属性 setter 。如果要配置getter,则应使用A.CallTo(() => @object.MyBooleanProperty)
。但无论如何,如果财产不是虚拟的,它就无法工作,正如你已经注意到的那样。