FakeItEasy Property不会更新

时间:2016-09-28 06:45:48

标签: c# fakeiteasy

我第一次使用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.

关于如何实现这一目标的任何想法?提前致谢。

1 个答案:

答案 0 :(得分:4)

如果属性不是虚拟的,那么执行@object.MyBooleanProperty= true只会调用MyObject实现,因为FakeItEasy(和其他模拟框架)只能拦截虚拟成员。因此,如果该属性在设置为true后仍为false,则必须是因为它在MyObject中的实现方式。 FakeItEasy并不参与其中。

至于此:

A.CallToSet(() => @object.MyBooleanProperty).To(true);

这仅仅意味着MyBooleanProperty@object设置为真时。它没有做任何事情,因为你没有指定行为(InvokesThrowsCallsBaseMethod ...)。为了帮助检测此类问题,请考虑使用FakeItEasy.Analyzer(可用on NuGet),它会提醒您未使用的呼叫规范和其他常见错误。

此外,A.CallToSet仅用于配置属性 setter 。如果要配置getter,则应使用A.CallTo(() => @object.MyBooleanProperty)。但无论如何,如果财产不是虚拟的,它就无法工作,正如你已经注意到的那样。