犀牛嘲笑存根和嘲笑仅供接口好?
-
24-09-2019 - |
题
时,它纠正犀牛嘲笑存根和嘲笑仅供界面好,不是具体的类?我花了相当多的时间试图让这片代码工作的。我没想到存根pubSubClient从类总是调用Send方法。该方法具有一些依赖并抛出异常。
[Test]
public void Test01()
{
PubSubMessage psm = new PubSubMessage();
var pubSubClient = MockRepository.GenerateStub<PubSubClient>();
pubSubClient.Stub(x => x.Send(psm)).IgnoreArguments().Return(null);
// actual PubSubClient Send method throws exception
// the rest of the test is skipped...
}
然而,当我已提取的接口和运行与IPubSubClient相同的测试,它似乎是如预期工作。
这是否意味着我必须提取每个类我想嘲笑犀牛/存根接口?或者我失去了一些东西,技术上或概念?
更新:OK,看来我想通了,我失踪了一部分: 的犀牛制品不能拦截调用非虚拟方法即可。所以,我想我要么使用的接口,使得在具体的类的每一个方法是虚拟的。如果有另一种选择请指正。
解决方案
使用部分嘲笑的布莱恩的答案不正确。这不是什么部分嘲笑是。
乔恩·埃里克森的回答大多是正确的:犀牛嘲笑和起订量无法拦截非虚调用,也不能截取静态方法或属性。这意味着你可以不假如下:
DateTime.Now; // static property, can't fake static property
someClass.SomeNonVirtualMethod(); // can't fake non-virtual method
sealedClass.Foo(); // can't fake anything on sealed classes
Utilities.SomeStaticMethod(); // can't fake static methods
someList.Any(); // can't fake extension methods like Linq's .Any()
TypeMock罐假这些,如乔恩提及。
应当指出有一个额外的模拟框架可以拦截所有呼叫:所述微软痣框架。它的工作方式相同TypeMock呢,它使用的.NET探查API拦截来电。
摩尔数是免费的(现在)。这也是beta版。痣只只适用于微软Pex的工具。而它的API显然不如TypeMock的精致,优雅的API。
其他提示
您必须使虚拟方法。犀牛制品(和大多数其他隔离框架)利用以创建存根/嘲笑代理类。
如果您使用TypeMock隔离器就可以,因为这种隔离框架利用.NET API探查,以打造存根/模拟考试
嘲笑什么这是基本正确,通常是很好的做法。然而,这只是真正的有用的编码的特定类型。
别以为对象作为的事情,一些“高功率”可以操纵的。相反,把它们作为独立的“人”,可以将消息发送到对方。的接口表示由一个单一的对象发送的消息。
您然后使用嘲笑来验证正确的消息被发送,而不是提供依赖性假实现。
在理想情况下,你没有创建完全是一个已经存在的类相匹配的接口 - 相反,类的消耗的接口中声明的接口形式的需求。
偏嘲笑允许你模拟出一个具体的类的功能。请参阅: http://www.ayende.com/wiki/Rhino+嘲笑+部分+ Mocks.ashx
我不认为还有比让你想嘲笑虚拟的任何方法这样做其它的另一种方式 - 我相信具体类的mock对象的方式创建由动态子类被嘲笑了具体的类,然后重写给定的与您在测试指定行为的方法,所以这需要正确的虚拟方法来工作。