2010-07-15 60 views
4

我見過很多類似的線程,但沒有一個能夠真正解決我的特殊情況。在ASP.NET 4.0中嘲諷HttpRequest

我在ASP.NET 4.0 Web應用程序(ASP.NET窗體,而不是MVC)中編寫單元測試。代碼中有幾個位置,我稱之爲ServerVariables集合以調用像REMOTE_ADDR這樣的變量。由於在執行我的代碼時,我的單元測試並沒有真正啓動HttpRequests,像ServerVariablesNull,因此錯誤,當我嘗試打電話給我找到解決這個問題指的MVC HttpContext.Current.Request.ServerVariables("REMOTE_ADDR")

所有的解決方案,並讓他們承擔該HttpRequest派生自HttpRequestBase,它在MVC中執行,但不在ASP.NET窗體中執行。

我試過使用Moq,但是你不能嘲笑一個密封的課程,並且HttpRequest不幸的是沒有界面密封。

回答

13

HttpRequestBaseHttpRequestWrapper類可以用於一些工作。

無論你目前訪問的是哪個地方HttpContext.Current.Request - 或者只是普通Page.Request - 你需要使用HttpRequestBase的注射實例。然後,您需要注入一個不同的HttpRequestBase的子類,具體取決於您是在測試還是在線。

  • 對於實時代碼,你可能會注入一個HttpRequestWrapper實例包裝HttpContext.Current.Request

    var liveRequest = new HttpRequestWrapper(HttpContext.Current.Request); 
    
  • 對於測試代碼,你需要創建和注入的HttpRequestBase你自己的模擬子類。推測Moq可以爲你做到這一點。

+0

謝謝!儘管如此,我仍然有點猶豫要更改實時代碼。實時代碼目前穩定且非常複雜,但是沒有單元測試框架。我試圖慢慢地將單元測試引入到混合中,並添加一個新功能。如果我必須更改穩定的代碼以符合單元測試,那麼我擔心單元測試很難賣給我的團隊的其他人 - 即使在測試驅動的開發中,它會從一開始就這樣寫。 – Adam 2010-07-16 18:00:32

+0

+1雖然是一個很好的答案。我仍然可能最終走上這條道路。 – Adam 2010-07-16 18:01:30

+0

我結束了去一個不同的路線,並使用WatiN進行單元測試。 WatiN從UI層進行測試,因此不需要模擬HttpRequest。謝謝你的幫助。無論如何,我將你的答案標記爲答案,因爲它確實回答了這個問題,不管這是否是我去的方向。 – Adam 2010-07-20 19:07:28