【问题标题】:How to unit test this controller?如何对该控制器进行单元测试?
【发布时间】:2013-06-23 17:13:42
【问题描述】:

在用户填写注册表并通过所有验证后,我正在使用 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 或路由的方法。有什么建议吗?

【问题讨论】:

    标签: asp.net-mvc unit-testing


    【解决方案1】:

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

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

    【讨论】:

    • 像魅力一样工作。谢谢。
    【解决方案2】:

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

    // act
    var result = someController.SomeAction() as RedirectToRouteResult;
    
    // assert
    Assert.AreEqual("ExpectedRoute", result.RouteValues["action"]);
    Assert.AreEqual("ExpectedController", result.RouteValues["controller"]);
    

    【讨论】:

    • 是的,谢谢,对不起,我相信编辑后的代码更清晰一点。实际上,当我使用 as 关键字时,结果为 null,不知道为什么...
    猜你喜欢
    • 2012-04-24
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多