Quali sono le differenze tra mock e stub su Rhino Mocks?

Non ho giocato abbastanza con questo e di solito uso i mock, ma mi chiedo quali sono le differenze tra questi due e quando usare l’uno o l’altro su Rhino Mocks.

Aggiornare:

Ho anche trovato la risposta alla mia domanda nelle parole di Ayende :

La differenza tra mozziconi e mock

È ansible ottenere la definizione effettiva di questi termini in questo articolo: Mazzi non sono Stub . Voglio concentrarmi sulla differenza dal punto di vista di Rhino Mocks.

Un finto è un object su cui possiamo impostare aspettative e che verificherà che le azioni previste siano effettivamente avvenute. Uno stub è un object che usi per passare al codice sotto test. Puoi impostare le aspettative su di esso, in modo che agisca in determinati modi, ma quelle aspettative non saranno mai verificate. Le proprietà di uno stub si comportano automaticamente come normali proprietà e non è ansible impostare aspettative su di esse.

Se si desidera verificare il comportamento del codice in prova, si utilizzerà una simulazione con l’aspettativa appropriata e la si verificherà. Se vuoi semplicemente passare un valore che potrebbe dover agire in un certo modo, ma non è il fulcro di questo test, utilizzerai uno stub.

IMPORTANTE: uno stub non causerà mai un test fallito.

In base a questo

… Detto semplicemente c’è una differenza tra oggetti Mock e Stub e RhinoMocks riconosce che ci consente di scrivere test che meglio stabiliscono il loro scopo.

Gli oggetti fittizi sono usati per definire le aspettative, ovvero: In questo scenario mi aspetto che il metodo A () venga chiamato con tali e tali parametri. I mock registrano e verificano tali aspettative.

Le mute, d’altra parte hanno uno scopo diverso: non registrano o verificano le aspettative, ma piuttosto ci permettono di “sostituire” il comportamento, lo stato dell’object “falso” per utilizzare uno scenario di test …

In generale, i test di unità chiamano funzioni e metodi, quindi controllano se il comportamento previsto è avvenuto. Queste funzioni e metodi potrebbero richiedere parametri. Usiamo stub e mock per soddisfare questi parametri. A volte potremmo anche prendere in giro oggetti globali.

stubs

Uno stub è un minuscolo object falso che il test può utilizzare come parametro per far funzionare la chiamata alla funzione. Questo ci permette di verificare il comportamento della funzione sotto test. Non ci permette di verificare alcun effetto collaterale, perché lo stub non ha implementazione.

Mocks

Un Mock è uno stub con un’implementazione. Se la nostra funzione sotto test interagisce con il nostro object mock, possiamo verificare che il mock sia stato interagito come ci aspettavamo.

Ad esempio, supponiamo di avere un object Utente fittizio e volevamo verificare che il nostro metodo session.login funzionasse, potremmo voler controllare che sia stato impostato user.lastLoggedIn. Potremmo creare un utente fittizio che implementa questo metodo. Quando chiamiamo session.login, possiamo affermare che user.lastLoggedIn ha lo stato che ci aspettavamo.

Per riassumere

Un finto è uno stub con un’implementazione, che ci permette di testare gli effetti collaterali.

Questa differenza è ancora importante?

Piuttosto come la differenza tra similitudini e metafore, la differenza tra stub e mock è sottile e storica, e forse ha più a che fare con le diverse comunità e filosofie nel mondo dei test rispetto a qualsiasi differenza tecnica importante.

Rappresentano approcci leggermente diversi ai test. Un finto può essere scritto come uno stub. Solitamente uno stub può essere espanso in una simulazione.

Quale dovresti usare?

Potresti scoprire di iniziare a creare stub, quindi in seguito potresti scoprire di aver bisogno di creare mocki completi per alcuni dei tuoi oggetti. Potresti voler prendere in giro tutto mentre vai, oppure potresti voler prendere in giro dove richiesto.

Differenza tra Mock e stub: con stub, puoi correggere l’input del tuo unit test: così il tuo unit test non effettua asserzioni su stub e Stub riscrivendo l’implementazione di qualche metodo per correggere il comportamento di un object falso. con Mock, correggi l’output del tuo test unitario: così il tuo test unitario ti darà un’aspettativa sul tuo object Mocking controllando l’interazione interna nel tuo object fittizio.

In caso di framework Moq – il metodo di installazione è STUB dove il metodo di verifica è Mock

Una cosa che ho notato è che quando utilizzo MockRepository.GenerateMock, ho bisogno di impostare in modo esplicito le aspettative su una chiamata al metodo specifico per intercettare quella chiamata. Con stub, sembra intercettare automaticamente qualsiasi metodo purché sia ​​virtuale.