2009-05-20 13 views
11

Qualcuno può dirmi perché nel mondo il seguente test non sta fallendo?Rhino Mocks: Repeat.Once() non funziona?

[Test] 
public void uhh_what() { 
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>(); 
    a.Expect(x => x.Notify()).Repeat.Once(); 
    a.Notify(); 
    a.Notify(); 
    a.VerifyAllExpectations(); 
} 

davvero bisogno di un secondo paio di occhi per confermare Io non sono pazzo ... ora mi sono preoccupato che tutti i miei test sono inaffidabili.

risposta

23

C'è già un thread on the RhinoMocks group.

GenerateMock crea una simulazione dinamica. La simulazione dinamica consente le chiamate che non sono specificate (= previsto). Se ciò accade, restituisce semplicemente null (o il valore predefinito del tipo restituito).

Nota: La ripetizione è una specifica del comportamento (come Stub), non l'aspettativa anche se specificata in un'aspettativa.

Se si vuole evitare di avere più di un certo numero di chiamate, si potrebbe scrivere:

[Test] 
public void uhh_what() 
{ 
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>(); 
    a.Expect(x => x.Notify()).Repeat.Once(); 
    a.Stub(x => x.Notify()).Throw(new InvalidOperationException("gotcha")); 
    a.Notify(); 

    // this fails 
    a.Notify(); 

    a.VerifyAllExpectations(); 
} 

O

[Test] 
public void uhh_what() 
{ 
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>(); 
    a.Notify(); 
    a.Notify(); 

    // this fails 
    a.AssertWasCalled(
     x => x.Notify(), 
     o => o.Repeat.Once()); 
} 
+1

oh! Non sapevo che AssertWasCalled aveva un secondo argomento in cui si potevano fare più specifiche, questo cambia tutto! –

+1

È lo stesso problema con PartialMock, se mai ci passi sopra. – Dennis

+1

La prima soluzione (dove si genera un'eccezione) _will_ effettua il test fallito se 'Notify' viene chiamato più di una volta. Tuttavia, se è chiamato solo una volta (almeno questo è quello che presumo dovrebbe fare il codice sotto test), il test non passerà come dovrebbe perché si aspetta una chiamata _second_ a 'Notify' che non arriva mai. Impostare 'a.Expect (x => x.Notify()). Repeat.Once()' seguito da 'a.Stub (x => x.Notify()). Getti (...)' per fare il lavoro. – geoffmazeroff

7

Quando si utilizza GenerateMock (o con Mocks dinamici in generale) ho sempre inserire mentalmente quanto segue:

a.Expect (x => x.Notify()). Ripetere. * [AtLeast] * Una volta();

Problemi correlati