如何在FakeItEasy中模拟受保护的虚拟成员?

14

Moq允许模拟受保护的虚成员 (参见此处)。在FakeItEasy中是否也可以做到相同的效果?

2个回答

36

这是可以实现的,但是不能直接使用。关键是要实现IFakeObjectCallRule并通过Fake.GetFakeManager(foo).AddRule(myRule)将其添加到fake中。

我正在考虑实现这个功能,代码大概会像这样:

A.CallTo(foo).WhereMethod(x => x.Name == "MyProtectedMethod").Returns("whatever");

不过语法还没有完全细化。

编辑 上述功能现已实现:

A.CallTo(foo).Where(x => x.Method.Name == "MyProtectedMethod").WithReturnType<int>().Returns(10);

太棒了。非常感谢这个新功能。现在我可以再次删除自己的规则了。 - Daniel Rose
我尝试了您提供的代码,但是MyProtectedMethod方法仍然被调用。我期望它返回虚假的返回值,但不调用原始方法。我做错了什么吗? - stusherwin
2
@stusherwin 或许这个方法不是虚拟的? - Daniel Rose

19

除了Patrik的答案之外,我认为在这篇帖子中增加一个提示会很有帮助,它可以告诉你如何模拟受保护的属性成员:

A.CallTo(foo).Where(x => x.Method.Name == "get_MyProtectedProperty").WithReturnType<int>().Returns(10);
这实际上是反射处理属性的“getter”方法的方式。希望能有所帮助 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接