Xaisoft
Xaisoft

Reputation: 46591

How do I check if the Create method was called using Expect instead of AssertWasNotCalled in Rhino Mocks?

How do I check if Create was not called without using the Rhino Mocks AssertWasNotCalled method.

Here is the test:

    [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();
    }

Also, can someone clarify what Stub does.

Upvotes: 1

Views: 696

Answers (2)

Yann Trevin
Yann Trevin

Reputation: 3823

directoryInfoMock.Stub(x => x.Exists).Return(true);

ensures that any call to the property directoryInfoMock.Exists will return true. But if the property is never call or called many times, it will not cause the test to fail. The purpose of the stub is to provide some meal to your code under test so that it can run normally.

directoryInfoMock.Expect(x => x.Create());

expects that the method directoryInfoMock.Create be called at least once. If not, an exception will be thrown by Rhino.Mocks during the execution of directoryInfoMock.VerifyAllExpectations().

So basically, your unit test should work as expected. What is the output of the test?


UPDATE:
You might want to specify an explicit number of times the method should be called as well. This can be done by using Repeat.x with x is Once(), Twice(), Never(), or Times(N).

directoryInfoMock.Expect(x => x.Create()).Repeat.Never();

This expects that Create is never called. And of course your test will fail if it is actually called.

Upvotes: 2

Grzenio
Grzenio

Reputation: 36649

If you need to make sure that only the methods you expect are called you can consider using strict mocks. Then you will get an exception when a method was called that was not expected on your mock, the only change to your code is when you create your mock:

var directoryInfoMock = MockRepository.GenerateStrictMock<IDirectoryInfoWrap>();

if you know exactly which method shouldn't be called its better to use AssertWasNotCalled (you use it after your test was executed). This way you don't tie your test with your code so closely.

Upvotes: 1

Related Questions