2010-01-04 39 views
6

使用Rhinomocks,我如何验证模拟/存根从未被调用?意思是在模拟/存根上没有调用方法?Rhinomocks,如何验证存根/模拟从未被调用?

我知道AssertWasNotCalled方法,但此方法要求我提到方法名称。 (也许我有一个类可以调用10种不同的方法)。

Log.AssertWasNotCalled(x => x.LogAndReportException(null, null), x => x.IgnoreArguments()); 

回答

1

可以使用StrictMock方法来创建一个严格的模拟 - 如果有任何相应稳固的方法调用,这将失败。根据Ayende's site,这是不鼓励的,但它听起来像是它将是有用的情况。

1

当你使用模拟,你不应该断言每一个电话是否被做出。这会将你的测试与特定的实现结合起来,并使它们变得脆弱并成为重构的噩梦。

如果我遇到过这种情况,我会重新思考为什么我想断言依赖从未被使用过。

很明显,如果依赖不在任何地方使用,只要将其删除。如果某些操作需要它,但是依赖项中的所有操作都是破坏性操作,并且您希望确保某些操作不会对它们造成伤害,则应明确断言破坏性操作未被调用并且允许执行操作无论它想用什么非破坏性操作(如果有的话)。这使得你的测试更加明确并且不那么脆弱。

+0

+1一般来说,我同意,特别是在涉及脆弱性测试时。但是,这可能是一个有效的请求。想象一下使用方法注入的接口。由于接口上的方法需要注入抽象参数,因此必须提供一些内容。现在假设你正在为该接口创建一个'null'实现,并且要求是注入的参数(它必须由于接口而存在)从不使用。我承认,这是一个小众情景,但仍然相关:) – 2010-01-04 12:41:56

+0

@Mark:是的,这是一个可以接受的用法。我知道有一些情况可能会有用,但我不能提出一个。 – 2010-01-04 12:48:38

+1

是不是对守卫子句进行单元测试是确保方法内的任何依赖关系不被调用的好地方?我目前正在为这个场景编写一个单元测试,我想确保guard子句按照预期工作,并且从不会调用模拟。 – Maslow 2010-01-06 17:57:09

6

您可以使用一个严格的Mock,althought这是可能消失在未来的一个特点:

var mocks = new MockRepository(); 
var cm = mocks.StrictMock<ICallMonitor>(); 
cm.Replay(); 

cm.HangUp(); // this will cause VerifyAllExpectations to throw 
cm.VerifyAllExpectations(); 

在此语法中,一个陈吉伟模拟只允许明确定义调用。

+0

如果我正确理解这一点,在这种情况下,“重播”和“挂机”都不会导致验证失败? – Maslow 2010-01-06 17:51:55

+2

@Maslow:没有。 'Replay'是一个Rhino Mocks扩展方法,它将模拟放在重放模式中。在它处于记录模式之前,并且未记录任何呼叫。当它进入重放模式时,它将准确地表示:不能对其进行呼叫。 – 2010-01-06 18:13:01

+0

啊,除非我错过了扩展方法,或者这是来自不同的版本,在我的代码中它是'mocks.Replay(cm);'然后'mocks.VerifyAll();' – Maslow 2010-01-06 20:22:58

相关问题