2011-09-29 27 views
5

Tôi có bộ điều khiển sau:Làm thế nào để kiểm tra mã trạng thái HTTP được thiết lập bởi một hành động ASP.NET MVC với MSpec

public sealed class SomeController : Controller 
{ 
    public ActionResult PageNotFound() 
    { 
     Response.StatusCode = 404; 

     return View("404"); 
    } 
} 

Tôi đã tạo ra một đặc điểm kỹ thuật MSpec:

[Subject(typeof (SomeController))] 
public class when_invalid_page_is_requested : SomeControllerSpec 
{ 
    Because of =() => result = Controller.PageNotFound(); 

    It should_set_status_code_to_404 = 
     () => Controller.Response.StatusCode.ShouldEqual(404); 
} 

public abstract class SomeControllerSpec 
{ 
    protected static HomeController Controller; 

    Establish context =() => { Controller = new SomeController(); }; 
} 

Nhưng vì cách Tôi nhanh chóng điều khiển, HttpContext là null. Cách tốt nhất để kiểm tra mã trạng thái được đặt bởi hành động PageNotFound là gì?

EDIT: Đăng một câu trả lời dưới đây

Trả lời

6

Tìm thấy một cách để làm điều đó bằng Moq.

[Subject(typeof (SomeController))] 
public class when_invalid_page_is_requested : SomeControllerSpec 
{ 
    Because of =() => result = Controller.PageNotFound(); 

    It should_set_status_code_to_404 = 
     () => HttpResponse.VerifySet(hr => hr.StatusCode = 404); 
} 

public abstract class SomeControllerSpec 
{ 
    protected static SomeController Controller; 
    protected static Mock<ControllerContext> ControllerContext; 
    protected static Mock<HttpResponseBase> HttpResponse; 

    Establish context =() => 
    { 
     ControllerContext = new Mock<ControllerContext>(); 
     HttpResponse = new Mock<HttpResponseBase>(); 
     ControllerContext.SetupGet(cc => cc.HttpContext.Response) 
         .Returns(HttpResponse.Object); 

     Controller = new SomeController 
         { 
          ControllerContext = ControllerContext.Object 
         }; 
    }; 
} 

Không phải rất thanh lịch. Nếu bạn có thể nghĩ ra một cách tốt hơn - hãy cho tôi biết.

3

Bạn có thể sử dụng:

_controller.Response.StatusCode 
+0

Tôi đã cập nhật câu hỏi của mình với nhiều thông tin hơn. –

+0

Bạn cần phải thử trước. Ví dụ bằng cách gọi 'controller.SetMockControllerContext()' từ https://gist.github.com/johnnyreilly/4959924#file-mvcmockhelpers-cs. –

3

Một tùy chọn sử dụng MvcContrib 's TestControllerBuilder ...

var myController = new MyController(); 

var testControllerBuilder = new TestControllerBuilder(); 
testControllerBuilder.InitializeController(myController); 

và sau đó sử dụng NUnit (tôi đoán phiên bản Moq sẽ làm việc giống như bạn có nó) ...

myController.Response.AssertWasCalled(response => response.StatusCode = 400); 

Tất cả các thiết lập xấu xí và công việc nhạo báng vẫn đang được thực hiện, nhưng bởi MvcContrib thay vì bên trong thử nghiệm. Đây là một bài đăng trên using the TestControllerBuilder.