2012-03-26 28 views
11

Tôi có bộ điều khiển trong MVC3 cần trả lại mã phản hồi 500 nếu có sự cố. Tôi đang làm điều này bằng cách trả về một đối tượng xem và thiết lập mã phản hồi http bằng 500 (tôi đã kiểm tra điều này trong firebug và tất cả đều hoạt động tốt).Mã phản hồi thử nghiệm đơn vị MVC3

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

    return View(); 
} 

Vấn đề bây giờ là tôi cần có thể viết kiểm tra đơn vị kiểm tra mã phản hồi. Tôi đã thử truy cập mã phản hồi theo nhiều cách khác nhau thông qua đối tượng ViewResult và ngữ cảnh Controller.

Cả hai cách đều không cho tôi mã phản hồi mà tôi đã đặt trong bộ điều khiển.

[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); 

} 

Tôi làm cách nào để nhận mã phản hồi 500 từ bộ điều khiển hoặc điều này là thử nghiệm tích hợp hơn.

Trả lời

33

Làm thế nào về làm việc đó một cách MVCish hơn:

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

và sau đó:

// 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); 

hoặc nếu bạn nhấn mạnh vào việc sử dụng các đối tượng Response bạn có thể tạo ra một giả một:

// 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

Tôi thích cách tiếp cận này, câu hỏi nhanh chóng, nếu một hành động điều khiển trả về cả mã trạng thái và chế độ xem với mô hình, có cảm giác hay không cách tốt nhất để bắt chước cả đáp ứng mã trạng thái và kết quả khung nhìn/mô hình? Tôi đang đấu tranh để nghĩ ra một lựa chọn hợp lý. – dougajmcdonald

+0

câu hỏi hay @dougajmcdonald. bạn có nhận được câu trả lời không? – richardwhatever

0

FakeHttpObject() là gì? Nó là một mô hình được tạo ra bằng cách sử dụng Moq? Trong trường hợp đó, bạn cần phải thiết lập setters và getters để lưu trữ các giá trị thực tế ở đâu đó. Mock<T> không cung cấp bất kỳ triển khai nào cho các thuộc tính và phương pháp. Khi thiết lập một giá trị của tài sản theo nghĩa đen không có gì xảy ra và giá trị là 'mất'.

Một tùy chọn khác là cung cấp ngữ cảnh giả mạo là một lớp cụ thể với các thuộc tính thực.

Các vấn đề liên quan