0

新しいユーザーの登録に使用されるコントローラーをテストしようとしています。

    [HttpPost]
    public ActionResult Register(ClientViewModel clientViewModel)
    {

        if (ModelState.IsValid)
        {
            var client = new Client
            {
                //filling object from clientViewModel
            };

            var license = new License
            {
                //filling object from clientViewModel
            };

            if (AccountFacade.AddClientLicense(client, license))
            {
                var licenseId = AccountFacade.GetLicenseIdForUsername(Applications.UBetPro, clientViewModel.UserName);

                if (licenseId.HasValue)
                {
                    AccountFacade.AddAccount(licenseId.Value);
                    return RedirectToAction("RegisterSuccess");
                }
            }

        }

        return View(clientViewModel);
    }

これはコード全体ではありませんが、テストに関連する唯一の部分だと思います。追加と検証のためのメソッドは、ビジネス ロジックのファサードから呼び出され、そのすべてのメソッドと共に単体テストでモック化されます。コントローラーは、登録が成功したときに表示されるフォームにユーザーをリダイレクトすることになっています。それが私がテストしようとしているものです。これは私の単体テストです:

    public void Register_WithUniqueUsernameAndEmail_ReturnsRegistrationSuccessful()
    {
        // Arrange:
        var mock = new Mock<IAccountFacade>();
        mock.Setup(/*mocking methods*/);
        var controller = new AccountController(mock.Object);

        var context = new ControllerContext();

        var fakeClientViewModel = new ClientViewModel
                                  {
                                      FirstName = "test",
                                      ...
                                      ...
                                   };

        // Act:
        var result = controller.Register(fakeClientViewModel);
        // how do I get the name of result or something similar?

        // Assert: ???

    }

単体テストには Moq と Structure Map を使用しています。メソッドのセットアップは正常に機能します。唯一の問題は、結果フィールドに固有のものにアクセスできないことです。これにより、結果フィールドを認識してアサート部分で使用できます。モデルが View("RegisterSuccess") を使用した場合、問題はないと思いますが、RedirectToAction に簡単にアクセスできないことがわかりました。私が使用しようとしているものとは異なる解決策がある場合は、喜んで試してみたいと思います。

4

2 に答える 2

0

とった。

var result = (RedirectToRouteResult)controller.Register(fakeClientViewModel);
Assert.AreEqual("RegisterSuccess", result.RouteValues["action"]);
于 2013-06-25T14:44:14.103 に答える