Domanda

Mi è stato detto di non usare dettagli di implementazione. Una dipendenza sembra un dettaglio di implementazione. Tuttavia ho potuto frase anche come un comportamento.

Esempio: Un LinkList dipende da un motore di memorizzazione per memorizzare i collegamenti (es LinkStorageInterface). Il costruttore deve essere passato un'istanza di un LinkStorageInterface implementata per fare il suo lavoro. Non posso dire 'shouldUseLinkStorage'. Ma forse posso dire 'shouldStoreLinksInStorage'.

Che cosa è corretto per 'test' in questo caso? Dovrei provare che memorizza i collegamenti in un negozio (comportamento) o non provare questo a tutti?

È stato utile?

Soluzione

La dipendenza in sé non è un comportamento previsto, ma le azioni chiamate sulla dipendenza certamente lo sono. Si consiglia di verificare la roba che (il chiamante) sai, ed evitare di testare la roba che richiede di avere una profonda conoscenza del funzionamento interno del SUT.

Ampliare il vostro esempio un po ', lascia immaginare che la nostra LinkStorageInterface ha la seguente definizione (pseudo-codice):

Interface LinkStorageInterface

  void WriteListToPersistentMedium(LinkList list)

End Interface

Ora, dal momento che (il chiamante) sta fornendo l'attuazione concreta di tale interfaccia è perfettamente ragionevole, per testare che WriteListToPersistentMedium() viene chiamato quando si richiama il metodo Save() sul LinkList.

Un test potrebbe assomigliare a questo, ancora una volta utilizzando pseudo-codice:

void ShouldSaveLinkListToPersistentMedium()

  define da = new MockLinkListStorage()  
  define list = new LinkList(da)

  list.Save()

  Assert.Method(da.WriteListToPersistentMedium).WasCalledWith(list)

end method

Hai provato comportamento previsto senza l'attuazione di test specifici dettagli sia il vostro SUT, o il vostro finto. Che cosa si vuole evitare di test (la maggior parte) sono cose come:

  1. Ordine in cui sono stati chiamati i metodi
  2. Fare un metodo o una proprietà pubblica solo così è possibile controllare
  3. Tutto ciò che non coinvolgono direttamente il comportamento previsto si esegue il test

Anche in questo caso, una dipendenza è qualcosa che voi come il consumatore della classe sta fornendo, in modo che ci si aspetta di essere utilizzato. In caso contrario, non v'è alcun punto di avere che la dipendenza in primo luogo.

Altri suggerimenti

LinkStorageInterface non è un dettaglio di implementazione - suggerisce il nome un'interfaccia per ad un motore. Nel qual caso il nome shouldUseLinkStorage ha più valore di shouldStoreLinksInStorage .

Questo è il mio 2 centesimi vale la pena!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top