我一直在嘗試一段時間來爲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;
現在,我得到的財產異常訪問該對象。我儘可能多地嘲笑,但似乎沒有什麼快。
有沒有人設法使這項工作?
很久以前,我放棄了單元測試視圖。嘗試將您擁有的任何業務邏輯移入控制器,然後單元測試。單元測試的觀點非常複雜。 可能有一個真實的答案,但我放棄了它,因爲我們的觀點發展太快。 – CVertex 2008-10-24 05:58:28
是的,一般來說,我不想測試我的觀點,但是當我使用用戶控件時,這是一個可重複使用的部分,經常在應用程序中使用,並且沒有控制器代碼。我想測試它可以被實例化和渲染,並且包含大致正確的東西。 – 2008-10-27 12:24:28
據我所知,你實際上正在測試repo.GetMeSomeData(),它不依賴於視圖或用戶控件。你能否檢查一下repo.GetMeSomeData()是否給你你想要的而不是調用控件? – Graviton 2009-01-01 10:01:09