there seems to be a debate online about whether private methods should be tested or not.
Davvero? Dov'è questo presunto dibattito?
Se fa parte del tuo software, deve funzionare. Di solito, questo significa testarlo per assicurarsi che funzioni.
If I have an interface that exposes one method, but that method is quite complex and calls multiple other private methods and also makes use of other objects, how do I go about testing that method?
Passaggio 1: rendilo meno complesso. Seriamente. Se si trova difficile estrarre i diversi bit per testarli separatamente, sarà necessario un doppio tocco per modificare o riutilizzare quei bit diversi in uno scenario non di prova. Fatti un favore e ripulisci la funzione.
Sì, sì, "ma ho fatto tutto il possibile! Questa è una circostanza eccezionale!", l'ho già sentito prima ... Le probabilità sono, non è davvero eccezionale. Quindi domanda 2:
Surely I should be testing the smallest units possible, even though many of these will be private methods belonging to the class under test?
Assolutamente. Ma è anche necessario testare la responsabilità della cosa che aggrega quei metodi privati insieme, per assicurarsi che abbia fatto questa aggregazione correttamente per ottenere il risultato corretto. In un mondo ideale, ciò significherebbe trattarlo come una scatola nera. Prendi alcuni input, controlla che le uscite siano come previsto. Nel mondo reale, avrai probabilmente molti input / setup - ma questo è quello che ottieni per non semplificare il metodo in primo luogo.