MVC3单元测试响应代码

时间:2012-03-26 12:01:24

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

我在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,或者这更像是集成测试。

2 个答案:

答案 0 :(得分:36)

如何以更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);

答案 1 :(得分:0)

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

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

相关问题