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 进行单元测试。方法设置工作正常,唯一的问题是我无法访问特定于结果字段的内容,我可以通过这些内容识别它并在 Assert 部分中使用它。如果模型使用 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 回答
0

您需要将结果转换为 ActionResult 或 RedirectResult 取决于您正在测试的代码部分

var result = controller.Register(fakeClientViewModel) as ActionResult;

完成此操作后,您可以检查视图名称、模型数据等

于 2013-06-24T15:45:26.780 回答