Ich versuche zu verstehen, was die Idee hinter TDD ist und wie ein Team damit arbeiten soll. Ich habe den folgenden Testfall mit NUnit + Moq (nur durch Speicher schreiben, es ist nicht sicher, dass das Beispiel kompiliert wird, aber es sollte erklärend sein):
[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 hat 3 Abhängigkeiten, die ich verspotte, damit ich bei der Orchestrierung im Controller überprüfen kann, ob eine Anmeldung korrekt war oder nicht.
Was mich stolpert, ist, dass ... wenn Sie in TDD theoretisch zuerst Ihre Testsuite schreiben und Ihren Code daraus aufbauen müssen, wie soll ich vorher wissen, dass ich sie verwenden muss, um meine Operation auszuführen diese drei Abhängigkeiten und dass die Operation bestimmte Operationen aufruft? Es ist, als müsste ich die Innereien des zu testenden Subjekts kennen, bevor ich es überhaupt implementiere, um die Abhängigkeiten zu verspotten und die Klasse zu isolieren und eine Art Schreibtest zu erstellen - Code schreiben - Test bei Bedarf zu ändern.
Ohne die Innereien meines Codes zu kennen und nur den Test auszudrücken, könnte ich ihn natürlich so ausdrücken, als würde er nur den ILoginHelper benötigen und "magisch" annehmen, bevor er den Code schreibt, dass er den Benutzer bei einer erfolgreichen Anmeldung zurückgibt (und letztendlich Beachten Sie, dass das zugrunde liegende Framework nicht so funktioniert, z. B. nur eine ID anstelle des vollständigen Objekts zurückgibt.
Verstehe ich TDD falsch? Welches ist eine typische TDD-Praxis in einem komplexen Fall?
Vielen Dank