2010-02-10 60 views
5

我目前正在測試我的應用程序,並試圖弄清楚如何創建一個自定義假URL引用鏈接。我試圖硬編碼它,但得到一個錯誤,它是隻讀的。以下是我試過到目前爲止:在ASP.Net MVC中爲單元測試創​​建一個模擬URL引用鏈接

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

以及,

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

我在網上搜索了關於如何創建一個假的/模擬URL引用了我的假的一些想法控制器,但沒有運氣。歡迎任何建議。

注意:我使用的是Visual Studios內置的單元測試工具。

UPDATE:

謝謝大家的建議,到目前爲止,我會更願意使用任何其他單元測試系統的Visual Studio之外,不幸的是在這裏我的工作中,我們只允許使用Visual Studio的更多內置系統,所以我必須與我所擁有的一起工作。不過謝謝你,很高興知道這些選項在那裏。

回答

1

建議更改爲模擬框架,例如NMock或Rhino Mock,它允許您創建這些模型,併爲特定的調用返回特定的值,例如該屬性中的get方法。

7

爲HttpContext創建一個模擬請求,然後在返回Uri的請求上設置一個期望值。使用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我開始使用起訂量鍵入了類似的回答,但你打我給它 – 2010-02-10 18:05:27

+0

哎tvanfosson,試圖與瞎搞這個代碼片段,但我得到和錯誤的context.expect() 參數'1':不能從'System.Web.HttpRequestBase'轉換爲'System.Web.HttpRequest' – kingrichard2005 2010-02-10 18:53:29

1

您將需要創建一個完整的模擬HttpContext爲了完成這個不幸的。而不是硬編碼,我會強烈建議使用mock,因爲這樣可以避免設置你實際上不需要的對象。

我會建議查看Scott Hanselmann's MvcMockHelpers帖子,以瞭解涉及的內容(它包括Rhino和Moq的代碼)。

2

tvanfosson's Answer是正確的方向,但有點過時。 (授予OP不能使用起訂量,增加備查)

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

相關問題