如何在不使用Rhino Mocks AssertWasNotCalled方法的情况下检查是否未调用Create。
以下是测试:
[Test]
public void When_try_to_create_directory_that_already_exits_return_false()
{
var directoryInfoMock = MockRepository.GenerateMock<IDirectoryInfoWrap>();
directoryInfoMock.Stub(x => x.Exists).Return(true);
directoryInfoMock.Expect(x => x.Create());
Assert.AreEqual(false, new DirectoryInfoSample().TryToCreateDirectory(directoryInfoMock));
directoryInfoMock.VerifyAllExpectations();
}
此外,有人可以澄清Stub的作用。
答案 0 :(得分:2)
directoryInfoMock.Stub(x => x.Exists).Return(true);
确保对属性directoryInfoMock.Exists
的任何调用都将返回true
。但是,如果该属性从未被多次调用或调用,则不会导致测试失败。存根的目的是为您的代码提供一些膳食,以便它可以正常运行。
directoryInfoMock.Expect(x => x.Create());
期望方法directoryInfoMock.Create
至少被调用一次。如果不是,则在执行directoryInfoMock.VerifyAllExpectations()
期间Rhino.Mocks将抛出异常。
基本上,您的单元测试应该按预期工作。测试的输出是什么?
<强>更新强>:
您可能还想指定应该调用该方法的显式次数。这可以通过Repeat.x
使用x
Once()
,Twice()
,Never()
或Times(N)
来完成。
directoryInfoMock.Expect(x => x.Create()).Repeat.Never();
预计Create
从不被调用。当然,如果真的被调用,你的测试将会失败。
答案 1 :(得分:1)
如果你需要确保只调用你期望的方法,你可以考虑使用严格的模拟。然后,当调用一个在模拟上不期望的方法时,你会得到一个异常,代码的唯一变化是你创建模拟时:
var directoryInfoMock = MockRepository.GenerateStrictMock<IDirectoryInfoWrap>();
如果您确切地知道哪个方法不应该被调用,那么最好使用AssertWasNotCalled(在执行测试后使用它)。这样,您就不会将测试与代码紧密联系在一起。