【问题标题】:MVC3 unit testing response codeMVC3 单元测试响应代码
【发布时间】:2012-03-26 12:01:23
【问题描述】:

我在 MVC3 中有一个控制器,如果出现问题,它需要返回响应代码 500。我通过返回一个视图对象并将http响应代码设置为等于500来做到这一点(我已经在firebug中检查了这个并且一切都很好)。

public ActionResult http500()
{
    ControllerContext.HttpContext.Response.StatusCode = 500;
    ControllerContext.HttpContext.Response.StatusDescription = "An error occurred whilst processing your request.";

    return View();
}

我现在遇到的问题是我需要能够编写一个检查响应代码的单元测试。我已经尝试通过 ViewResult 对象和 Controller 上下文以几种不同的方式访问响应代码。

这两种方法都没有给我我在控制器中设置的响应代码。

[TestMethod()]
public void http500Test()
{
   var controller = new ErrorController();
   controller.ControllerContext = new ControllerContext(FakeHttpObject(), new RouteData(), controller);


   ViewResult actual = controller.http500() as ViewResult;
   Assert.AreEqual(controller.ControllerContext.HttpContext.Response.StatusCode, 500);

}

我将如何从控制器获取响应代码 500,或者这更像是一个集成测试。

【问题讨论】:

    标签: asp.net-mvc-3 unit-testing moq


    【解决方案1】:

    用更 MVCish 的方式来做如何:

    public ActionResult Http500()
    {
        return new HttpStatusCodeResult(500, "An error occurred whilst processing your request.");
    }
    

    然后:

    // arrange
    var sut = new HomeController();
    
    // act
    var actual = sut.Http500();
    
    // assert
    Assert.IsInstanceOfType(actual, typeof(HttpStatusCodeResult));
    var httpResult = actual as HttpStatusCodeResult;
    Assert.AreEqual(500, httpResult.StatusCode);
    Assert.AreEqual("An error occurred whilst processing your request.", httpResult.StatusDescription);
    

    或者如果你坚持使用 Response 对象,你可以创建一个假的:

    // arrange
    var sut = new HomeController();
    var request = new HttpRequest("", "http://example.com/", "");
    var response = new HttpResponse(TextWriter.Null);
    var httpContext = new HttpContextWrapper(new HttpContext(request, response));
    sut.ControllerContext = new ControllerContext(httpContext, new RouteData(), sut);
    
    // act
    var actual = sut.Http500();
    
    // assert
    Assert.AreEqual(500, response.StatusCode);
    Assert.AreEqual("An error occurred whilst processing your request.", response.StatusDescription);
    

    【讨论】:

    • 我喜欢这种方法,但快速提问,如果控制器操作返回状态码和带有模型的视图,是否有一种明智的方法来模拟状态码响应和视图/模型结果?我正在努力想一个明智的选择。
    【解决方案2】:

    FakeHttpObject() 是什么?它是使用 Moq 创建的模拟吗?在这种情况下,您需要设置 setter 和 getter 以将实际值存储在某处。 Mock<T>不提供任何属性和方法的实现。当设置属性值时,实际上没有任何反应,并且该值“丢失”。

    另一种选择是提供一个假上下文,它是一个具有真实属性的具体类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多