Asp.net-Mvc-3
MVC3 單元測試響應程式碼
我在 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,或者這更像是一個集成測試的事情。
如何以更 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);