Sto cercando di capire qual è l'idea alla base di TDD e come dovrebbe funzionare una squadra. Ho il seguente test case con NUnit + Moq (basta scrivere a memoria, non è sicuro che l'esempio compili ma dovrebbe essere esplicativo):
[Test]
public void WhenUserLogsCorrectlyIsRedirectedToLoginCorrectView() {
Mock<IUserDatabaseRepository> repoMock = new Mock<IUserDatabaseRepository>();
repoMock.Setup(m => m.GetUser(It.IsAny())).Returns(new User { Name = "Peter" });
Mock<ILoginHelper> loginHelperMock = new Mock<ILoginHelper>();
loginHelperMock.Setup(m => m.Login(It.IsAny(), It.IsAny())).Returns(true);
Mock<IViewModelFactory> factoryMock = new Mock<IViewModelFactory>();
factoryMock.Setup(m => m.CreateViewModel()).Returns(new LoginViewModel());
AccountController controller = new AccountController(repoMock.Object, loginHelperMock.Object, factoryMock.Object)
var result = controller.Index(username : "Peter", password: "whatever");
Assert.AreEqual(result.Model.Username, "Peter");
}
AccountController ha 3 dipendenze che faccio finta che, quando orchestrato all'interno del controller, mi permetta di verificare se un login fosse corretto o meno.
Ciò che mi incuriosisce è che ... se in TDD in teoria dovessi scrivere prima la tua suite di test e costruire il tuo codice da esso, come dovrei sapere in anticipo che per poter eseguire la mia operazione è necessario utilizzare queste tre dipendenze e che l'operazione chiamerà determinate operazioni? È come se avessi bisogno di conoscere le parti interne del Subject Under Test prima ancora di implementarlo per simulare le dipendenze e isolare la classe, creando una sorta di test di scrittura - codice di scrittura - modifica il test se necessario ciclo.
Naturalmente, senza alcuna conoscenza delle parti interne del mio codice e solo nell'esprimere il test, potrei esprimerlo come se potesse semplicemente aver bisogno di ILoginHelper e "magicamente" supporre prima di scrivere il codice che restituirà l'utente su un login riuscito (e alla fine si rende conto che il framework sottostante non funziona in questo modo, ad esempio restituendo solo un ID invece dell'oggetto completo).
Sto comprendendo il TDD in modo errato? Qual è una tipica pratica TDD su un caso complesso?
Grazie