gpt4 book ai didi

c# - 如何对 MVC UserViewControl 进行单元测试?

转载 作者:太空狗 更新时间:2023-10-29 20:12:21 25 4
gpt4 key购买 nike

我一直在尝试为 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

我尝试使用 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;

现在我得到了对该对象的属性访问的异常。我尽可能多地 mock ,但似乎无处可去。

有没有人设法做到这一点?

最佳答案

不幸的是,ASP.NET View 引擎在 ASP.NET 宿主环境中使用 VirtualPathProvider。更糟糕的是,我使用 Reflector 跟踪了一些其他代码,发现对 VirtualPath 实用程序的某些硬编码引用存在其他依赖性。我希望他们在发行版中修复此问题,以便我们可以真正测试我们的 View 及其呈现方式。

关于c# - 如何对 MVC UserViewControl 进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/229185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com