2010-06-25 2 views
17

Я звоню _mocks.ReplayAll(), затем один или несколько _mockedObject.AssertWasCalled(), а затем _mocks.VerifyAll(). Но он говорит мне, что «это действие недействительно, когда макет объекта находится в состоянии записи».Как правильно использовать Rhino.Mocks AssertWasCalled()?

[Test] 
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused() 
{ 
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused }; 
    _taskDataProvider.Expect(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused)); 
    _mockRepository.ReplayAll(); 
    _manager.SetStateExecuting(task); 
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, 
                    TaskState.Executing)); 
    _mockRepository.VerifyAll(); 
} 

Что такое правильный порядок называть так, что эти методы работают правильно?

ответ

-1

Похоже, я нашел решение. Это кажется немного странным, но это работает. Оказывается, что мне нужно вызвать ReplayAll() дважды по какой-то причине ...

Это работает:

[Test] 
public void SetStateExecuting_Should_Set_State_To_Pause_And_Not_Change_GlobalState_When_GlobalState_Is_Paused() 
{ 
    var task = new Task { ID = 1, TimeZone = -660, GlobalState = TaskState.Paused }; 
    _mockRepository.ReplayAll(); 
    _manager.SetStateExecuting(task); 
    _taskDataProvider.AssertWasCalled(p => p.StateUpdate(task.ID, task.TimeZone, TaskState.Paused)); 
    _taskDataProvider.AssertWasNotCalled(p => p.GlobalStateUpdate(task.ID, TaskState.Executing)); 
    _mockRepository.ReplayAll(); 
} 
+2

Привет, Может быть полезно, чтобы показать, как вы объявляете _manager и т. д. Мне обычно не было бы так сложно. Также полезно использовать код, который вы тестируете. Если вы хотите получить помощь Rhino Mocks, я должен сказать, что у меня была помощь от коллег, а также из книги «Искусство модульного тестирования» http://www.manning.com/osherove/ – ArtificialGold

12

Вы смешиваете старый шаблон записи/воспроизведения и новый AAA pattern.

Обычный способ создать «не вызывается с этими аргументами» ожидание в режиме записи выглядит следующим образом:

_taskDataProvider.Expect(
    p => p.GlobalStateUpdate(task.ID, TaskState.Executing)).Repeat.Never(); 

или в качестве альтернативы, вы можете использовать строгий макет, который просто не позволяет неожиданным звонки.

AssertWasCalled и AssertWasNotCalled предназначены для AAA, где вы указываете свои утверждения в конце. С синтаксисом Record/Replay, как поведение, так и эксцессы должны быть настроены в начале до переключения в режим воспроизведения.

(AssertWasNotCalled может реально работать с Record/Replay также, но я никогда не пробовал, потому что я не люблю смешивать элементы обоих подходов. Это неоправданно усложняет.)

16

блоге Джона Крюгера "How to use rhino mocks documented through tests" имеет простой примеры всего, что вы можете сделать с методами носорогов. Он также показывает, что вы не можете сделать, что я нашел очень полезным в обучении.

Как уже упоминалось ранее, использование синтаксиса Arrange, Act, Assert с статическими конструкторами легче читать. В блоге показаны примеры обоих методов.

Вот примеры из примеров кода Джона:

Новый синтаксис:

[Test] 
    public void You_can_check_to_see_if_a_method_was_called() 
    { 
     var stub = MockRepository.GenerateStub<ISampleClass>(); 

     stub.MethodThatReturnsInteger("foo"); 

     stub.AssertWasCalled(s => s.MethodThatReturnsInteger("foo")); 
     stub.AssertWasCalled(s => s.MethodThatReturnsInteger(Arg<string>.Is.Anything)); 
    } 

Старый стиль:

[Test] 
    public void Calling_virtual_methods_will_call_the_actual_method() 
    { 
     var mockRepository = new MockRepository(); 
     var sampleClass = mockRepository.PartialMock<SampleClass>(); 
     sampleClass.Replay(); 

     sampleClass.VirtualMethod("foo").ShouldEqual(3); 
     sampleClass.VirtualMethodWasCalled.ShouldBeTrue(); 
     sampleClass.AssertWasCalled(c => c.VirtualMethod("foo")); 
    } 
Смежные вопросы