2008-10-23 61 views
7

我一直在嘗試一段時間來爲ASP.NET MVC中的UserViewControl編寫單元測試。我希望得到的代碼看起來是這樣的:我該如何測試MVC UserViewControl?

[TestMethod] 
public void HaveControlToDisplayThings() 
{ 
    var listControl = new ControlUnderTest(); 
    var viewData = new ViewDataDictionary<IList<string>>(this.repo.GetMeSomeData()); 

    // Set up a ViewContext using Moq. 
    listControl.SetFakeViewContext(viewData); 
    listControl.ViewData = viewData; 
    listControl.RenderView(listControl.ViewContext); 

    // Never got this far, no idea if this will work :) 
    string s = listControl.ViewContext.HttpContext.Response.Output.ToString(); 
    Assert.AreNotEqual(0, s.Length); 
    foreach (var item in this.repo.GetMeSomeData()) 
    { 
     Assert.IsTrue(s.IndexOf(item) != -1); 
    } 
} 

不幸的是,無論我怎麼努力,我從內心深處的RenderView出現錯誤。這是由靜態HttpContext.Current對象造成的(據我所知)無用 - 我從System.Web.UI.Page.SetIntrinsics得到NullReferenceException

我試着用菲爾哈克的HttpSimulator這給了我一個HttpContext對象,但我發現我還需要指定一個假HttpBrowserCapabilities對象來獲得進一步小幅:

Subtext.TestLibrary.HttpSimulator simulator = new HttpSimulator(); 
simulator.SimulateRequest(); 
var browserMock = new Mock<HttpBrowserCapabilities>(); 
browserMock.Expect(b => b.PreferredRenderingMime).Returns("text/html"); 
browserMock.Expect(b => b.PreferredResponseEncoding).Returns("UTF-8"); 
browserMock.Expect(b => b.PreferredRequestEncoding).Returns("UTF-8"); 
HttpContext.Current.Request.Browser = browserMock.Object; 

現在,我得到的財產異常訪問該對象。我儘可能多地嘲笑,但似乎沒有什麼快。

有沒有人設法使這項工作?

+0

很久以前,我放棄了單元測試視圖。嘗試將您擁有的任何業務邏輯移入控制器,然後單元測試。單元測試的觀點非常複雜。 可能有一個真實的答案,但我放棄了它,因爲我們的觀點發展太快。 – CVertex 2008-10-24 05:58:28

+0

是的,一般來說,我不想測試我的觀點,但是當我使用用戶控件時,這是一個可重複使用的部分,經常在應用程序中使用,並且沒有控制器代碼。我想測試它可以被實例化和渲染,並且包含大致正確的東西。 – 2008-10-27 12:24:28

+0

據我所知,你實際上正在測試repo.GetMeSomeData(),它不依賴於視圖或用戶控件。你能否檢查一下repo.GetMeSomeData()是否給你你想要的而不是調用控件? – Graviton 2009-01-01 10:01:09

回答

3

不幸的是,ASP.NET viewengine在ASP.NET宿主環境中使用了VirtualPathProvider。更糟糕的是,我使用Reflector追蹤了其他一些代碼,並發現對於某些到VirtualPath實用程序的硬編碼引用還存在其他依賴關係。 我希望他們在發佈中解決這個問題,以便我們真正能夠測試視圖以及它們如何呈現。

2

一種選擇是在瀏覽器內運行單元測試。對於這種情況,我已成功應用Selenium

2

我們放棄了單元測試視圖,現在正在使用WatiN瀏覽器測試作爲構建的一部分。

我們還使用Resharper解決方案廣泛分析來檢查是否存在編譯器錯誤。不完美,但它會得到非常相似的結果。下行 - WatiN測試很慢。

1

這些是需要在HttpBrowserCapabilities對象中設置的值,以便運行一個asp.net webforms站點,我會嘗試確保這些值已設置,看看是否可以修復您的問題,我不確定它是否會但是,嘿它值得一拍嗎?

  • 瀏覽器(也稱爲名稱)
  • 用戶代理(在請求中傳遞)
  • 表(真/假)
  • 版本
  • w3cdomversion(例如1.0)
  • (瀏覽器例如1.0版本)
  • 餅乾(真/假)
  • ecmascriptversion(例如1.0)

希望這會有所幫助。

1

我會推薦selenium以及UI測試。標準的MVC應用程序中有相當多的可以進行單元測試,但UI級別的組件似乎更適合Selenium之類的瀏覽器內測試。您可以使用cruisecontrol.net將Selenium測試與您的單元測試進行整合。

這裏是一個guide用於集成Selenium和你的CC.Net。

1

使用TypeMock來嘲笑依賴關係。我已經寫了one blog post關於如何模擬Controller層中的請求和響應依賴關係。也許這有幫助。