如何对该控制器进行单元测试?

时间:2013-06-23 17:13:43

标签: asp.net-mvc unit-testing

我正在使用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进行测试。如果控制器刚刚返回一个视图我认为我没有问题,但使用RedirectToAction方法,我找不到一种方法来访问重定向表单的实际URL或路由。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

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

Assert.AreEqual("ExpectedActionName", result.RouteValues["action"]);
Assert.AreEqual("ExpectedControllerName", result.RouteValues["controller"]);

答案 1 :(得分:0)

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

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

// assert
Assert.AreEqual("ExpectedRoute", result.RouteValues["action"]);
Assert.AreEqual("ExpectedController", result.RouteValues["controller"]);