我已经尝试了一段时间,想用ASP.NET 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
s。
我尝试使用Phil Haack的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;
现在,我在该对象的属性访问上得到了异常。我尽我所能地嘲笑了许多人,但似乎毫无进展。
有没有人能做到这一点?
发布于 2008-12-23 15:37:09
不幸的是,ASP.NET视图引擎在ASP.NET托管环境中使用VirtualPathProvider。更糟糕的是,我使用Reflector跟踪了一些其他代码,发现对VirtualPath实用程序的一些硬代码引用还有其他依赖关系。我希望他们在发行版中修复这个问题,这样我们就可以真正测试我们的视图以及它们是如何呈现的。
发布于 2008-12-23 15:27:10
一种选择是在浏览器中运行单元测试。在这种情况下,我已经成功地使用了Selenium。
发布于 2008-12-23 15:34:33
我们放弃了单元测试视图,现在正在使用WatiN浏览器测试作为我们构建的一部分。
我们还使用Resharper Solution Wide Analysis来检查是否存在编译器错误。不是完美的,但它得到了非常相似的结果。缺点- WatiN测试很慢。
https://stackoverflow.com/questions/229185
复制相似问题