2010-02-10 48 views
5

Tôi hiện đang thử nghiệm ứng dụng của mình và bị kẹt khi cố gắng tìm ra cách tạo liên kết giới thiệu URL giả tùy chỉnh. Tôi đã cố gắng để mã nó cứng, nhưng tôi nhận được một lỗi rằng nó là chỉ đọc. Dưới đây là những gì tôi đã cố gắng cho đến nay:Tạo liên kết giới thiệu URL giả lập trong ASP.Net MVC để kiểm tra đơn vị

fakeController.HttpContext.Request.UrlReferrer.AbsolutePath = "http://www.yahoo.com"; 

cũng như,

fakeController.Request.UrlReferrer = "http://www.yahoo.com"; 

Tôi đã tìm kiếm trên web cho một số ý tưởng về cách để tạo ra một giả/giả giới thiệu URL cho giả của tôi điều khiển, nhưng không có may mắn. Mọi đề xuất đều được chào đón.

Lưu ý: Tôi đang sử dụng các thiết bị thử nghiệm đơn vị tích hợp của Visual Studios.

UPDATE:

Cảm ơn tất cả các bạn đã góp ý của bạn cho đến nay, tôi sẽ có nhiều hơn sẵn sàng sử dụng bất kỳ hệ thống kiểm tra đơn vị khác bên ngoài của Visual Studio, tiếc là ở đây tại nơi làm việc của tôi, chúng tôi chỉ được phép sử dụng Visual Studio được xây dựng trong hệ thống, vì vậy tôi phải làm việc với những gì tôi đã có. Cảm ơn bạn mặc dù, nó là tốt để biết các tùy chọn này được ra khỏi đó.

Trả lời

1

Tôi khuyên bạn nên chuyển sang khung Mock như NMock hoặc Rhino Mock, cho phép bạn tạo và trả về giá trị cụ thể cho một cuộc gọi cụ thể như phương thức get trong thuộc tính đó.

7

Tạo một yêu cầu giả lập cho HttpContext, sau đó thiết lập một kỳ vọng trên Yêu cầu trả về một Uri. Ví dụ sử dụng RhinoMocks.

var context = MockRepository.GenerateMock<HttpContextBase>(); 
var request = MockRepository.GenerateMock<HttpRequestBase>(); 
request.Expect(r => r.UrlReferrer).Returns(new Uri("http://www.yahoo.com")).Repeat.AtLeastOnce(); 
context.Expect(c => c.Request).Returns(request).Repeat.Any(); 

fakeController.HttpContext = context; 
+0

+1 tôi bắt đầu gõ một câu trả lời tương tự như sử dụng Moq nhưng bạn đánh bại tôi vào nó –

+0

hey tvanfosson, cố gắng rối tung xung quanh với đoạn mã này, nhưng tôi nhận được và lỗi cho ngữ cảnh.Expect() Đối số '1': không thể chuyển đổi từ 'System.Web.HttpRequestBase' thành 'System.Web.HttpRequest' – kingrichard2005

1

Bạn sẽ cần tạo toàn bộ mô hình HttpContext để thực hiện điều này không may. Thay vì hardcoding này, tôi rất muốn đề nghị sử dụng mocks, vì điều này sẽ cho phép bạn tránh thiết lập các mảnh của đối tượng mà bạn không thực sự cần.

Tôi khuyên bạn nên xem Scott Hanselmann's MvcMockHelpers bài đăng để biết một số ý tưởng về những gì có liên quan (bao gồm cả mã cho cả Rhino và Moq).

2

Câu trả lời của tvanfosson là đúng hướng nhưng có một chút lỗi thời. (OP Cấp không thể sử dụng MOQ, bổ sung để tham khảo trong tương lai)

// Dependency Mocks initialization .... 
    .... 
    MyController controller = new MyController(mock.Object, ...dependencies...); 

    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    request.Setup(r => r.UrlReferrer).Returns(new Uri("http://www.site.com")); 
    context.Setup(c => c.Request).Returns(request.Object); 

    // Setting the HttpContext 
    // HttpContext is read-only, but it is actually derived from the 
    // ControllerContext, which you can set. 
    controller.ControllerContext = new ControllerContext(context.Object, 
     new RouteData(), controller); 
    //target.HttpContext = context.Object; // outdated 

HttpContext from Controller context

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