Estou tentando entender qual é a idéia por trás do TDD e como uma equipe deve trabalhar com ele. Eu tenho o seguinte caso de teste com NUnit + Moq (apenas escrevendo pela memória, não é garantido que o exemplo seja compilado, mas deve ser explicativo):
[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");
}
O AccountController tem 3 dependências, que eu zombo que, quando orquestradas dentro do controlador, permitem-me verificar se um login estava correto ou não.
O que me surpreende é que ... se no TDD, em teoria, você tiver que escrever primeiro seu conjunto de testes e criar seu código a partir dele, como devo saber de antemão que, para realizar minha operação, preciso usar essas três dependências e que a operação chamará determinadas operações? É como se eu precisasse conhecer as entranhas do Assunto em Teste antes mesmo de implementá-lo para zombar das dependências e isolar a classe, criando algum tipo de teste de gravação - código de gravação - teste de modificação, se necessário.
Naturalmente, sem nenhum conhecimento das entranhas do meu código e apenas expressando o teste, eu poderia expressá-lo como se fosse necessário apenas o ILoginHelper e "magicamente" supor antes de escrever o código que retornará o usuário em um login bem-sucedido (e, finalmente, perceba que a estrutura subjacente não funciona dessa maneira, por exemplo, retornando apenas um ID em vez do objeto completo).
Estou entendendo o TDD de maneira incorreta? Qual é uma prática típica de TDD em um caso complexo?
Obrigado