Solo per ottenere confusione: sto iniziando dalla posizione in cui so già cosa deridere, dove e come farlo. Semplicemente non so come adattare il mocking al processo TDD.
Quindi diciamo che ho già fatto un my_function () e voglio scrivere MyClass () che usa my_function () da qualche parte. Diciamo che il mio obiettivo finale è qualcosa del genere:
class MyClass():
(...)
def some_method():
var = my_function()
self._do_something(var)
Scrivere questo in modo classico sarebbe facile:
- Scrivi il codice.
- Renditi conto che my_function () deve essere preso in giro perché contiene alcune connessioni e altro.
- Scrivi un my_function mock.
- Scrivi un test per MyClass (). some_method () usando la simulazione.
- Esegui il test.
Voglio farlo prima, però, ma finora mi è venuto in mente solo questo:
- Scrivi il test per MyClass (). some_method (), ignorando il mock.
- Esegui il test: fallisce.
- Scrivi il codice.
- Esegui il test - fallisce perché my_function () ha alcune dipendenze esterne e ha bisogno di un certo ambiente ecc.
- Scrivi la simulazione e modifica il test.
- Esegui il test - passa.
Questo approccio sembra però imperfetto. Prima scrivo il test in modo da poterlo eseguire ancora e ancora mentre scrivo il codice, aspettando che diventi verde. Con il mio approccio il mio test non diventerà mai verde prima di decidere che sono "fatto" con il codice e solo dopo inizierò a deridere (perché non saprò cosa deridere prima di scrivere il codice). Inoltre sto effettivamente cambiando il test in modo che usi la simulazione, mentre il codice è già "finito", quindi sto facendo il test per verificare effettivamente se ho finito di cambiare il test, e non cambiare il codice (spero di averlo ho un senso qui).
Che ne pensi? Il mio processo TDD è difettoso o va bene e il mio ragionamento su di esso è difettoso? Ho provato a cercare in rete ma non ho trovato nessuno che discutesse o spiegasse questo particolare aspetto. O è solo beffardo, supponendo che il codice sia già stato scritto, o sia TDD e l'ipotesi è che non si hanno dipendenze da prendere in giro.