2009-04-21 20 views

Trả lời

15

Sử dụng RhinoMocks:

var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
var httpRequest = MockRepository.GenerateMock<HttpRequestBase>(); 

httpContext.Expect(c => c.Request).Return(httpRequest).Repeat.Any(); 

... set up expectations on request... 

var controller = new MyController(); 
controller.ControllerContext = new ControllerContext(httpContext, 
                 new RouteData(), 
                 controller); 

...invoke action, check assertions... 

httpContext.VerifyAllExpectations(); 
httpRequest.VerifyAllExpectations(); 
11

Sử dụng Moq:

var request = new Mock<HttpRequestBase>(MockBehavior.Strict); 
request.Setup(x => x.ApplicationPath).Returns("/"); 
request.Setup(x => x.Url).Returns(new Uri("http://localhost/home")); 
request.Setup(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection()); 

var context = new Mock<HttpContextBase>(MockBehavior.Strict); 
context.SetupGet(x => x.Request).Returns(request.Object); 

var controller = new YourController(); 
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller); 
11

Thủ công (vì tôi ghét Mocking khuôn khổ đòi hỏi 8 dòng thiết lập cho mỗi thử nghiệm)

// in some common location, only once 
public class MockHttpContext : HttpContextBase 
{ 
    public MockHttpRequest m_request = new MockHttpRequest(); 
    public MockHttpResponse m_response = new MockHttpResponse(); 

    public override HttpRequestBase Request 
    { get { return m_request; } } 

    public override HttpResponseBase Response 
    { get { return m_response; } } 
} 

public class MockHttpRequest : HttpRequestBase 
{ 
    // override whatever bits you want (eg cookies) 
} 

public class MockHttpResponse : HttpResponseBase 
{ 
    // override whatever bits you want (eg cookies) 
} 

// in your specific test 
controller = new YourController { 
    ControllerContext = new ControllerContext { HttpContext = new MockHttpContext() } 
}; 
+0

Tôi thích video này. Điều này dễ hiểu hơn nhiều so với chế nhạo. Bất kỳ lý do nào khiến m_request và m_response được công khai? –

+1

vì đó là một đối tượng giả mạo được thiết kế để giúp thử nghiệm mọi thứ dễ dàng hơn. Làm cho những người tư nhân sẽ chỉ có nghĩa là nếu tôi muốn thay đổi chúng (và đôi khi bạn có thể) Tôi muốn có một tài sản, vv, vv Một số quy tắc như thực hiện ẩn đang tích cực có hại trong loại môi trường –

+0

Tôi nhận ra lý do tại sao họ đang công khai ngay sau khi tôi đặt câu hỏi. Cả Yêu cầu và Phản hồi đều không có trình cài đặt, vì đó là cách nó nằm trong HttpContextBase. Vì vậy, nếu tôi cần phải thay đổi yêu cầu và phản hồi từ các bài kiểm tra đơn vị của tôi, tôi cần chúng công khai. –

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