2

在用户填写注册表并通过所有验证后,我正在使用 RedirectToAction 方法将用户重定向到另一个表单。唯一的问题发生在测试控制器期间。我应该如何测试用户是否已成功重定向到所需的表单?

控制器:

[HttpPost]
public ActionResult Register(ClientViewModel clientViewModel)
{ 
    if (ModelState.IsValid)
    {
       //filling db object 
                if (license.HasValue)
                {
                    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

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

    // Assert: ???
}

我正在使用 Moq 和 Nunit 进行测试。如果控制器只返回一个 View 我想我不会有问题,但是使用 RedirectToAction 方法,我找不到访问重定向表单的实际 url 或路由的方法。有什么建议么?

4

2 回答 2

1

您应该将您的result变量转换为返回的类型RedirectToAction,即RedirectToRouteResult. 然后您可以按如下方式对其进行单元测试:

var result = (RedirectToRouteResult)controller.Register(fakeClientViewModel);

Assert.AreEqual("ExpectedActionName", result.RouteValues["action"]);
Assert.AreEqual("ExpectedControllerName", result.RouteValues["controller"]);
于 2013-06-23T17:17:18.490 回答
0

您的示例不反映控制器/操作,但是测试断言看起来像这样:

// act
var result = someController.SomeAction() as RedirectToRouteResult;

// assert
Assert.AreEqual("ExpectedRoute", result.RouteValues["action"]);
Assert.AreEqual("ExpectedController", result.RouteValues["controller"]);
于 2013-06-23T17:17:44.087 回答