2013-06-23 51 views
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: ??? 
} 

我使用起订量和NUnit用于测试。如果控制器刚刚返回一个View,我认为我没有问题,但是使用RedirectToAction方法,我无法找到访问重定向窗体的实际url或路由的方法。有什么建议么?

回答

1

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

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

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

就像一个魅力。谢谢。 –

0

您的例子并不反映控制器/动作,但是测试断言将是这个样子:

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

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

是的,谢谢,抱歉,我相信编辑的代码更清晰一点。实际上,当我使用as关键字的结果为空,不知道为什么... –

相关问题