2010-09-07 2 views
1

Как проверить, не был ли вызван Create без использования метода Rhino Mocks AssertWasNotCalled.Как проверить, был вызван метод Create с использованием Expect вместо 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(); 
    } 

Кроме того, может кто-то уточнить, что делает тупиковой.

+0

Это не связано с вашим вопросом, но вы можете значительно улучшить читаемость и краткость ваших тестов, используя 'Assert.IsFalse (x)' вместо 'Assert.AreEqual (false, x)'. –

+0

Да, я знаю. Я просто проходил онлайн-учебник. Я только начал использовать MbUnit и заметил, что вы были частью проекта Gallio. Очень приятная работа. – Xaisoft

ответ

2
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 является никогда называется. И, конечно, ваш тест потерпит неудачу, если он действительно вызван.

+0

Ну, у меня есть один тест, где я хочу, чтобы Create был вызван, и это работает, но у меня есть еще один тест, в котором я не хочу, чтобы Create вызывался и было любопытно, если бы что-то вроде DoNotExpect вызывал этот метод. Кроме того, что касается вашего ответа на заглушки, если я правильно вас понимаю, я в основном устанавливаю для свойства Exists значение true в объекте Directory, вместо того, чтобы явно устанавливать его в другом месте. Если бы были другие свойства, которые мне нужно было установить, я тоже мог бы их заглушить, правильно? – Xaisoft

+0

Для шаблона «DoNotExpect» вы можете использовать свойство Repeat для Rhino.Mocks. См. Мой обновленный ответ. –

1

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

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

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

Смежные вопросы