Как проверить, был ли вызван метод Create с использованием Expect вместо AssertWasNotCalled в Rhino Mocks? - PullRequest
1 голос
/ 07 сентября 2010

Как проверить, что Create не вызывался без использования метода AssertWasNotCalled Rhino Mocks.

Вот тест:

    [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 ]

2 голосов
/ 07 сентября 2010
directoryInfoMock.Stub(x => x.Exists).Return(true);

гарантирует, что любой вызов свойства directoryInfoMock.Exists вернет true. Но если свойство никогда не вызывается или вызывается много раз, оно не вызовет сбой теста. Цель заглушки - предоставить тестируемому коду некоторую пищу, чтобы он мог нормально работать.

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

ожидает , что метод directoryInfoMock.Create будет вызван хотя бы один раз. Если нет, Rhino.Mocks выдаст исключение во время выполнения directoryInfoMock.VerifyAllExpectations().

Так что, в принципе, ваш юнит-тест должен работать как положено. Какой вывод теста?


UPDATE
Возможно, вы захотите указать явное количество раз, которое метод должен быть вызван также. Это можно сделать с помощью Repeat.x с x, равным Once(), Twice(), Never() или Times(N).

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

Ожидается, что Create никогда не вызывается 1032 *. И, конечно, ваш тест не пройдёт, если он действительно будет вызван.

1 голос
/ 08 сентября 2010

Если вам нужно убедиться, что вызываются только те методы, которые вы ожидаете, вы можете рассмотреть возможность использования строгих макетов. Тогда вы получите исключение при вызове метода, который не ожидался в вашем макете, единственное изменение в вашем коде - это когда вы создаете свой макет:

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

если вы точно знаете, какой метод не должен вызываться, лучше использовать AssertWasNotCalled (вы используете его после выполнения теста). Таким образом, вы не будете так тесно связывать свой тест с вашим кодом.

...