TDDの背後にあるアイデアと、チームがTDDを使用する方法を把握しようとしています。NUnit + Moqを使用した次のテストケースがあります(メモリで書き込むだけで、サンプルがコンパイルされるとは限りませんが、説明が必要です)。
[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には3つの依存関係があります。これを模擬しています。コントローラー内で調整すると、ログインが正しいかどうかを確認できます。
私の心をつまずくのは... TDDで理論的に最初にテストスイートを記述し、そこからコードをビルドする必要がある場合、操作を実行するために使用する必要があることを事前に知っておくにはどうすればよいですか。これらの3つの依存関係と、操作によって特定の操作が呼び出されることはありますか?それは、依存関係をモックしてクラスを分離するために実装する前に、テスト中のサブジェクトの内部を知る必要があるようなもので、ある種の書き込みテスト-コードの作成-必要に応じてテストを変更します。
当然、コードの内部についての知識がなく、テストを表現するだけで、ILoginHelperが必要であるように表現でき、「魔法のように」コードを書く前に、成功したログインでユーザーを返すと(そして最終的には)基礎となるフレームワークがそのように機能しないことを認識してください(たとえば、完全なオブジェクトの代わりにIDだけを返す)。
TDDを間違った方法で理解していますか?複雑なケースでの典型的なTDDプラクティスはどれですか?
ありがとうございました