获取RedirectToAction方法的可测试属性?

时间:2013-06-21 15:27:50

标签: asp.net-mvc unit-testing

我正在尝试测试我的控制器,该控制器用于注册新用户。

    [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不是那么容易访问。如果有一个不同于我试图使用的解决方案的解决方案,我很乐意尝试一下。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

知道了。

var result = (RedirectToRouteResult)controller.Register(fakeClientViewModel);
Assert.AreEqual("RegisterSuccess", result.RouteValues["action"]);