Sto cercando di capire meglio i test unitari e i test di integrazione. Capisco che i test unitari dovrebbero essere isolati e le loro dipendenze dovrebbero essere prese in giro. Ma sono un po 'incerto sul miglior approccio per affermare che ogni unità di classe testata si integri con le sue dipendenze.
Ecco un esempio:
Ho una classe chiamata ElasticDocumentFeeder che fondamentalmente richiama l'endpoint HTTP elastico e indicizza un documento. C'è un metodo chiamato AddDocument(Document document, logger)
Questo metodo chiama semplicemente l'endpoint utilizzando il client HTTP .net con un PUT per indicizzare un documento. Se il codice di risposta è diverso da 200, viene registrato un errore.
Voglio scrivere un test che asserisce che se un documento viene rifiutato da elastico, viene registrato l'errore.
Sono riuscito a farlo usando NUnit e Moq e sono in grado di affermare l'invocazione sul logger.
Quello che voglio sapere è: anche se sto testando questa classe, ha una dipendenza. Si aspetta che elastico sia in esecuzione su localhost: 9200. Quindi questo sarebbe considerato un test unitario o un test di integrazione?
So di poter astrarre l'endpoint HTTP in modo che possa simulare un'eccezione generata da elastico. Pensi che questo sarebbe l'approccio più corretto e di conseguenza sarebbe davvero un test unitario? O è bello avere qualcosa come l'elastico in esecuzione con un test unitario per quanto riguarda l'essere pragmatico?
Dovrei avere un test di integrazione end-to-end che copra tutto? Cioè un messaggio verrebbe prelevato da coniglio, quindi verrà effettuata una chiamata per creare un'istanza di MessageProcessor, quindi ElasticDocumentFeeder ecc.? Devo testare ogni classe individualmente contro tutte le sue dipendenze rispetto ai test di integrazione? O è questo tutto eccessivo, come avrei poi bisogno di un'istanza di coniglio e elasticsearch?