FakeItEasy 属性 没有更新

FakeItEasy Property doesnt get updated

我第一次使用 FakeItEasy 模拟复杂的数据结构。当像这样模拟对象并设置 属性 时,属性不会更新。它永远是假的。

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.

关于如何实现这一点有什么想法吗?提前致谢。

如果 属性 不是虚拟的,执行 @object.MyBooleanProperty= true 只会调用 MyObject 实现,因为 FakeItEasy(和其他模拟框架)只能拦截虚拟成员。因此,如果 属性 设置为 true 后仍然为 false,那一定是因为它在 MyObject 中的实现方式。这里根本不涉及 FakeItEasy。

至于这个:

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

它只是表示“当 MyBooleanProperty@object 上设置为真时。它不执行任何操作,因为您没有指定行为(InvokesThrows, CallsBaseMethod...)。为了帮助检测此类问题,请考虑使用 FakeItEasy.Analyzer (available on NuGet),它将提醒您未使用的调用规范和其他常见错误。

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