2013-03-25 48 views
1

我有點新的單元測試,並試圖在Visual Studio 2012中使用Moq和MSTest爲我的應用程序之一創建方法的測試。該應用程序的工作,因爲它應該,但是當我跑我的測試,我得到以下一空引用異常:Web API RouteUrl在測試中返回null異常

var fooURL = Url.RouteUrl("MyApi", new { httproute = string.Empty, controller = "MyController", id = id }, Request.Url.Scheme); 

我曾嘗試閱讀和包裝我的周圍ASP.NET MVC: Unit testing controllers that use UrlHelper頭,但這些似乎關注測試url本身。我更關心測試函數後面的內容。

上述鏈接中提到的設置太少(或太多)以至於無法使我的測試正常工作?還是我看錯了方向?

+0

什麼是null?它是'Request'還是'Request.Url'或'Request.Url.Scheme'? – ashes999 2013-03-25 15:17:33

+0

不幸的是,我不知道如何確定。所有我收到的錯誤消息是System.NullReferenceException:對象引用未設置爲對象的實例,當我雙擊我的StackTrace時,我被帶到上面提供的行。 – 2013-03-25 15:24:44

+0

沒問題。下載TestDriven.NET;在測試中設置一個斷點;單擊鼠標右鍵,說Test With,Debugger。檢查變量,或使用「Watch」來計算出結果。 – ashes999 2013-03-25 16:05:33

回答

0

根據您的意見,看起來好像Request爲空。我會推薦使用Google搜索how to mock out the request

我個人喜歡Ninject/Moq。這是一個非常易於使用,功能強大的組合。你可以這樣做:

  • 創建任何你需要模擬(在這種情況下,僅僅是Url屬性)
  • 使用Ninject到生產應用程序(綁定在Global.asax中的應用程序啓動的IHttpRequest接口事件)到真正的請求(Kernal.Bind<IHttpRequest>().To(HttpRequest)
  • 在您的測試案例,有一個基礎測試類或綁定到你的模擬類,而不是一個全球性的試運行類(或到new Mock<IHttpRequest>()實例)

你可能不得不使你的意圖rface複製真實HttpRequest類中的必要方法/簽名。如果這不起作用,您將需要創建一個包裝類來實現接口並將調用委託給一個真實的HttpRequest實例。

+0

這實際上適合你嗎? – ashes999 2013-03-26 03:00:33

+0

更多的是找出什麼是拋出空值。能夠改進我的搜索幫助我推進了我的測試。 – 2013-03-26 17:49:26