2009-02-12 30 views
6

Tôi đã sử dụng lớp MvcMockHelpers được tìm thấy tại Hanselman's blog để chuyển qua một HttpContext giả. Chúng tôi đã mở rộng nó một chút để thêm một số dữ liệu xác thực mà chúng tôi cần và phần lớn điều này là tuyệt vời.Mocking một HttpContext Response.Output với Moq

Vấn đề chúng tôi đang gặp là bối cảnh mà chúng tôi đang cung cấp cho bộ điều khiển có giá trị null trong HttpContext.Response.Output, điều này gây ra một số ngoại lệ cần được ném. Tôi không chắc phải thêm gì để làm việc này.

Đây là FakeHttpConext hiện tại() phương pháp:

public static HttpContextBase FakeHttpContext() 
{ 
    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    var response = new Mock<HttpResponseBase>(); 
    var session = new Mock<HttpSessionStateBase>(); 
    var server = new Mock<HttpServerUtilityBase>(); 

    // Our identity additions ... 
    var user = new Mock<IPrincipal>(); 
    OurIdentity identity = (OurIdentity)Thread.CurrentPrincipal.Identity; 

    context.Expect(ctx => ctx.Request).Returns(request.Object); 
    context.Expect(ctx => ctx.Response).Returns(response.Object); 
    context.Expect(ctx => ctx.Session).Returns(session.Object); 
    context.Expect(ctx => ctx.Server).Returns(server.Object); 
    context.Expect(ctx => ctx.User).Returns(user.Object); 
    context.Expect(ctx => ctx.User.Identity).Returns(identity); 
    return context.Object; 
} 

Dưới đây là phương pháp nổ (mà là một phần của XmlResult dự án của MVC contrib):

public override void ExecuteResult(ControllerContext context) 
{ 
    if (_objectToSerialize != null) 
    { 
     var xs = new XmlSerializer(_objectToSerialize.GetType()); 
     context.HttpContext.Response.ContentType = "text/xml"; 
     xs.Serialize(context.HttpContext.Response.Output, _objectToSerialize); 
    } 
} 

gì tôi cần phải thêm trong phương thức FakeHttpContext để ngăn chặn ngoại lệ null khi context.HttpContext.Response.Output được tham chiếu?

Làm rõ: Giải pháp tôi đang tìm kiếm cần được thực hiện trong Moq, chứ không phải Rhino. Tôi đã đề cập đến Moq trong tiêu đề câu hỏi nhưng bị bỏ qua trong cơ thể câu hỏi. Xin lỗi vì bất kỳ sự nhầm lẫn nào.

Nghị quyết tôi thêm hai dòng mã sau đây để các phương pháp FakeHttpContext():

var writer = new StringWriter(); 
context.Expect(ctx => ctx.Response.Output).Returns(writer); 

Điều này ngăn cản các ngoại lệ null. Không chắc chắn nếu nó là một câu trả lời tốt dài hạn, nhưng nó hoạt động ngay bây giờ.

Trả lời

3

Trong thử nghiệm cho MvcContrib tệp MvcMockHelps cho biết cách thực hiện.

+0

Dự án MVC Contrib sử dụng RhinoMocks chứ không phải Moq. Tôi có thể làm bài kiểm tra đơn vị để sử dụng Rhino, nhưng Rhino không phải là những gì văn phòng của chúng tôi đã chuẩn hóa. –

+1

Những gì bạn cần làm là thực hiện cuộc gọi đến mockedRequest.Output trả về một TextWriter và mockedRequest.OutputStream trả về một luồng như MemoryStream. – Matthew

+0

Có ... đây là phần tôi không biết phải làm thế nào. Vẫn đang thử những thứ khác nhau. –

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