2011-10-14 14 views
5

Come posso verificare che una mock venga chiamata nella parte "act" del mio test ignorando le chiamate alla simulazione nella parte "arrangement" del test.RhinoMocks: cancella o ripristina AssertWasCalled()

[Test] 
public void ShouldOpenThrottleWhenDrivingHome() 
{ 
    var engineMock = MockRepository.GenerateStub<IEngine>(); 
    var car = new Car(engineMock); 
    car.DriveToGroceryStore(); // this will call engine.OpenThrottle 

    car.DriveHome(); 

    engine.AssertWasCalled(e => e.OpenThrottle()); 
} 

Preferirei non provare un iniettare un mock fresco o fare affidamento su .Repeat() perché il test deve poi sapere quante volte il metodo viene chiamato nel setup.

+1

Questo era già stato chiesto: http://stackoverflow.com/questions/770013/rhino-mocks-how-to-clear -previous-expectations-on-an-object –

+0

Ho letto di nuovo la domanda - probabilmente non è un duplicato, ma non sono sicuro di quale sia esattamente la domanda. Che cosa deve fare ClearStub()? Dove sono stati inizializzati gli stub? –

+0

Sì, non è un duplciate. Ho modificato la domanda, si spera che sia più chiara. –

risposta

5

In queste situazioni io uso un finto posto di uno stub e la combinazione di Expect e VerifyAllExpectations:

//Arrange 
var engineMock = MockRepository.GenerateMock<IEngine>(); 
var car = new Car(engineMock); 
car.DriveToGroceryStore(); // this will call engine.OpenThrottle 

engineMock.Expect(e => e.OpenThrottle()); 

//Act 
car.DriveHome(); 

//Assert 
engineMock.VerifyAllExpectations(); 

In questo caso, l'aspettativa viene posizionata sul metodo dopo che l'organizzazione è stata completata. A volte penso a questo come a un proprio stile di prova: Disponi, Aspetta, Agisci, Asserisci

1

Ho riletto la tua domanda e sembra che tu voglia un metodo per separare tra le chiamate al simulato durante la fase Arrange e le chiamate al simulato durante la fase Act. Non conosco alcun supporto integrato per questo, ma quello che puoi fare è passare una richiamata usando WhenCalled. Nel tuo caso il codice sarebbe qualcosa di simile:

// Arrange 
var engineMock = MockRepository.GenerateStub<IEngine>(); 
var car = new Car(engineMock); 
int openThrotlleCount = 0; 
engineMock.Expect(x => x.OpenThrottle(arg)).WhenCalled(invocation => openThrotlleCount++); 
car.DriveToGroceryStore(); // this will call engine.OpenThrottle 
var openThrottleCountBeforeAct = openThrotlleCount; 

// Act 
car.DriveHome(); 

// Assert 
Assert.Greater(openThrotlleCount, openThrottleCountBeforeAct); 

Speranza che aiuta ...

Problemi correlati