Solo per il gusto della discussione qui sotto, quando mi riferisco al mocking, intendo il mocking / stubbing / finging, come contrasto per usare l'implementazione reale nei test
Ho appena avuto qualche discussione con il mio collega durante una sessione di programmazione di coppia riguardo a se dovremmo usare il mocking nei test unitari per il nostro codice scritto. (Non sono sicuro che questo sia importante, ma siamo una coppia in programmazione su una base di codice Ruby / Rails)
Il suo argomento è che non dovremmo usare il mocking se è il nostro codice scritto. Il mocking dovrebbe essere usato solo per estrapolare dipendenze esterne (.e.g. Sistema di terze parti). Diciamo che se ci sono classi A e B, e A dipende da B (.eg uno dei metodi di A crea e usa B), ha detto che non dovremmo prendere in giro B quando testiamo A (sia A che B sono scritti e mantenuti da noi ), poiché B è i dettagli di implementazione interna di A.
Anche se sono d'accordo con lui fino ad un certo punto, trovo ancora alcuni casi in cui è necessario e richiesto il nostro codice di simulazione:
- In primo luogo, credo che se non prendiamo in giro le dipendenze di una classe, non è più un test unitario. Quindi, come nell'esempio sopra, stiamo scrivendo test di integrazione per le classi A e B. Non sto dicendo che i test di integrazione non siano necessari, ma ci sono alcuni svantaggi rispetto al test unitario, ad esempio. eseguire più lentamente e quando un test non riesce, è necessario tracciare il codice di implementazione per identificare i componenti che causano l'errore. E quindi dovremmo chiarire cosa è il test unitario, che cos'è il test di integrazione
- In secondo luogo, non dovremmo testare e preoccuparci dei dettagli di implementazione di una classe finché il contratto pubblico continuerà a essere mantenuto. Tuttavia, credo che dovremmo testare l'interazione di una classe con le sue dipendenze (peer?) Poiché tali interazioni sono comportamenti previsti di quella classe. In alcuni casi, non è facile determinare quali siano i dettagli dell'implementazione e quale sia la dipendenza, ad esempio. in un'applicazione a livelli (controller - > servizio applicazioni - > dominio), è una dipendenza del servizio applicativo o implementazione interna di un controller?
Quindi le mie domande sono:
- Quali sono le tue opinioni su quando e dove usare il mocking?
- Qualsiasi buona euristica per decidere cos'è la dipendenza e quali sono i dettagli di implementazione interna? Prendi ad esempio l'applicazione sovrapposta sopra
Non sono sicuro che sia perché il mio background è in C #, trovo difficile accettare l'idea che il mocking non è necessario quando testiamo il nostro codice