我正在使用 Rhino Mocks 来设置严格的模拟。在某些情况下,不能对任何这些模拟执行方法调用。
// Arrange
var myMock = MockRepository.GenerateStrictMock<IMyClass>();
var sut = new SUT(myMock);
// Act
sut.DoSomething();
现在,DoSomething将所有内容包装在一个try-catch中:
public void DoSomething()
{
try {
m_Class.Something();
}
catch {
}
}
这会导致捕获严格模拟的预期异常。我的测试通过了,而不应该通过。
我本来希望打电话给myMock.VerifyAllExpectations();
会导致测试失败,但事实并非如此。
我怎样才能达到这个结果?
有一个吃掉异常的 catch 块通常是一种不好的做法。但是,如果您无法更改它,则可以使用 .AssertWasCalled()
和 .AssertWasNotCalled()
对成员进行更明确的断言,如下所示:
myMock.AssertWasNotCalled(x => x.Something())
但是,如果要验证未调用任何内容,则需要为每个可能的接口成员设置断言,这将很乏味,并且容易错过未来的成员。
不幸的是,对断言使用异常是 RhinoMocks(以及大多数单元测试框架,如 NUnit、Moq、NSubstitute 等)的基本原则,因此在它们传播到测试框架之前捕获这些异常通常是一个问题。