如何在Rhino Mocks中使用Expect而不是AssertWasNotCalled检查Create方法是否被调用?

时间:2010-09-07 17:56:45

标签: unit-testing rhino-mocks mbunit

如何在不使用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的作用。

2 个答案:

答案 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(在执行测试后使用它)。这样,您就不会将测试与代码紧密联系在一起。