2010-09-08 1 views
12

Qualsiasi lettura o consiglio che ho ricevuto sui Test unità ha sempre suggerito una netta differenza tra la definizione di un Mock e uno Stub. La mia attuale comprensione di queste definizioni sono i seguentiTest unitario Definizioni derubato/stub in Moq

Mock: Un falso che verrà utilizzato nel il test per fare un'affermazione finale

Stub: Un falso che verrà utilizzato nel il test per isolare una dipendenza ma non essere esercitati

Tuttavia, Moq appare per consentire solo la creazione di Mocks. Lo spazio dei nomi Stub nel framework sembra essere deprezzato con raccomandazioni per l'utilizzo di Mock.SetupXXX.

Mi manca qualcosa nella mia comprensione di questo? O c'è una comprensione generale che un oggetto finto può essere usato come niente più che uno stub?

Forse sono pedante, è solo che ho sempre trovato il linguaggio in programmazione per essere molto severo e preferisco averlo corretto, specialmente quando altri sviluppatori potrebbero prendere in consegna un progetto.

risposta

14

Secondo il Moq project site, Moq dispone:

controllo granulare sul comportamento finto con una semplice MockBehavior enumerazione (non c'è bisogno di conoscere qual è la differenza teorica tra un mock, uno stub, un falso, un mock dinamica , ecc.)

L'assenza di distinzione tra mock, mozziconi e simili è una decisione deliberata di progettazione; Una decisione di design che preferisco, per esempio. Se ho bisogno di uno vero vero, chiamo Verify() su di esso. In caso contrario, non c'è Verify(). Mi piace la semplicità e non mi sono mai perso la distinzione tra mock e stub.

2

è solo una specie di discussione sciocca.

Ciò che importa è che si usano i mock/stub per affermare ciò che è necessario nel test e non asserire ciò che non si ha.

+1

Non sono d'accordo eglasio.I test dovrebbero essere estremamente facili da leggere, digerire e capire cosa viene eseguito da altri sviluppatori. La lingua gioca un ruolo fondamentale in questo. – WDuffy

+0

@WDuffy sicuro, ma il modo in cui vedo è già stato comunicato chiaramente nel codice del test per raggiungerli. – eglasius

+0

Differenziare gli stub da Mock è utile per indicare al lettore del test di sapere quali messaggi sono rilevanti per il test corrente (aspettative) da quelli incidentali (stub) – Gishu

9

Martin Fowler ha scritto un buon articolo, Mocks Aren't Stubs, che a mio parere rende chiara la distinzione.

I mock sono utilizzati per la verifica del comportamento, mentre gli stub forniscono dati falsi e normalmente partecipano alla verifica dello stato.

+0

ma la verifica del comportamento si riferisce ai dati coinvolti, anche se tali dati è tenuto in un modo diverso. Certo, i termini sono chiaramente definiti, ma ciò non significa che non sia flessibile laddove tale distinzione sia chiaramente sfocata. – eglasius

+1

@eglasius Certo. Non ho problemi con una biblioteca che pensa che mi stia consegnando quello che chiama un finto anche se voglio usarlo come un mozzicone. Chiamerò semplicemente la variabile in modo appropriato per il mio utilizzo. –

+0

+1 decisamente d'accordo, se la squadra ritiene importante comunicare la distinzione, la denominazione della variabile lo chiarirà. – eglasius

0

Infatti, Moq può creare veri stub. Dal Moq Quick Start page:

* Setup a property so that it will automatically start tracking its value (also known as Stub): 

    // start "tracking" sets/gets to this property 
    mock.SetupProperty(f => f.Name); 

    // alternatively, provide a default value for the stubbed property 
    mock.SetupProperty(f => f.Name, "foo"); 


    // Now you can do: 

    IFoo foo = mock.Object; 
    // Initial value was stored 
    Assert.Equal("foo", foo.Name); 

    // New value set which changes the initial value 
    foo.Name = "bar"; 
    Assert.Equal("bar", foo.Name); 

* Stub all properties on a mock (not available on Silverlight): 

    mock.SetupAllProperties(); 

IMHO, le distinzioni tra sapori di falsi è meglio pensato come una distinzione tra funzioni di quei falsi piuttosto che tipi di falsi, come un falso può assumere molteplici ruoli a una volta (ad esempio può essere un vero finto e un sabotatore tutto in una volta), e poiché nessuna distinzione di questo tipo è necessaria per usare un finto quadro. (Dovrei blog su questo!)