2010-01-04 12 views
6

Utilizzando Rhinomocks, come posso verificare che non sia mai stato chiamato un Mock/stub? Significa che nessun metodo è stato chiamato sul mock/stub?Rhinomocks, come verificare che uno stub/mock non sia mai stato chiamato?

Sono a conoscenza del metodo AssertWasNotCalled, ma questo metodo richiede che menzioni un nome di metodo. (Forse ho una classe con 10 metodi diversi che potrebbero essere chiamati).

Log.AssertWasNotCalled(x => x.LogAndReportException(null, null), x => x.IgnoreArguments()); 

risposta

1

È possibile utilizzare il metodo StrictMock per creare un mock rigorosa - questo fallirà se viene utilizzato un metodo di chiamata unexcepted. Secondo Ayende's site, questo è scoraggiato, ma sembra esattamente lo scenario in cui sarebbe utile.

1

Quando si utilizzano i mock, non si dovrebbe asserire che ogni singola chiamata è stata effettuata o meno. Che accoppia i tuoi test a una particolare implementazione e li rende fragili e un incubo refactoring.

Se mai mi fossi imbattuto in questa situazione, vorrei ripensare perché volevo affermare che una dipendenza non è mai stata utilizzata.

Ovviamente, se la dipendenza non viene utilizzata da nessuna parte, è sufficiente rimuoverla. Se è necessario per alcune operazioni, ma tutte le operazioni nella dipendenza sono operazioni distruttive e si desidera assicurarsi che alcune operazioni non danneggino con esse, è necessario affermare esplicitamente che le operazioni distruttive non sono state chiamate e consentire l'implementazione di fare qualunque cosa voglia con le operazioni non distruttive (se ce ne sono). Ciò rende i test più espliciti e meno fragili.

+0

+1 In generale sono d'accordo, in particolare quando si tratta di prove fragili. Tuttavia, questa potrebbe essere una richiesta valida. Immagina un'interfaccia con Method Injection. Poiché un metodo sull'interfaccia utilizza un parametro astratto iniettato, è necessario fornire qualcosa. Supponiamo ora di creare un'implementazione "nulla" di tale interfaccia e il requisito è che il parametro iniettato (che deve essere presente a causa dell'interfaccia) non venga mai utilizzato. Un po 'uno scenario di nicchia, lo ammetto, ma ancora rilevante :) –

+0

@ Mark: sì, è un uso accettabile. Sapevo che c'era un caso angolare in cui poteva essere utile, non potevo inventarne uno. –

+1

Non è un test unitario su una clausola di guardia un buon posto per assicurarsi che le dipendenze all'interno del metodo non vengano chiamate? Sto attualmente scrivendo un test unitario per questo scenario in cui voglio assicurarmi che la clausola di guardia funzioni come previsto e che il mock non venga mai chiamato. – Maslow

6

è possibile utilizzare un modello rigoroso, ma decorate questa è una caratteristica che può andare via per il futuro:

var mocks = new MockRepository(); 
var cm = mocks.StrictMock<ICallMonitor>(); 
cm.Replay(); 

cm.HangUp(); // this will cause VerifyAllExpectations to throw 
cm.VerifyAllExpectations(); 

In questa sintassi, uno Strick Mock permette solo chiamate esplicitamente definite.

+0

Se ho capito bene, in questo scenario non ci sono sia/Replay che HangUp perché la verifica viene lanciata? – Maslow

+2

@Maslow: no. 'Replay' è un metodo di estensione di Rhino Mocks che posiziona il mock in modalità replay. Prima era in modalità registrazione e non ha registrato nessuna chiamata effettuata. Quando entra in modalità replay, consentirà esattamente che: nessuna chiamata può essere effettuata su di essa. –

+0

ah, a meno che mi manca il metodo di estensione o questo è da una versione diversa, nel mio codice era 'mocks.Replay (cm);' Quindi 'mocks.VerifyAll();' – Maslow

Problemi correlati