Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何对MVC UserViewControl进行单元测试?_C#_Asp.net Mvc_Mocking - Fatal编程技术网

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

C# 如何对MVC UserViewControl进行单元测试?,c#,asp.net-mvc,mocking,C#,Asp.net Mvc,Mocking,我一直在尝试在ASP.NET MVC中为UserViewControl编写一个单元测试。我想看一下这样的代码: [TestMethod] public void HaveControlToDisplayThings() { var listControl = new ControlUnderTest(); var viewData = new ViewDataDictionary<IList<string>>(this.repo.GetMeSomeData

我一直在尝试在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);
    }
}
现在我在该对象上的属性访问上出现异常。我尽可能地嘲弄了很多人,但似乎进展很快


有人能做到这一点吗?

一个选项是在浏览器中运行单元测试。我在这类案例中取得了成功。

我们放弃了单元测试视图,现在使用WatiN浏览器测试作为构建的一部分


我们还使用Resharper解决方案范围的分析来检查是否存在编译器错误。虽然不完美,但结果非常相似。缺点-WatiN测试很慢。

不幸的是,ASP.NET viewengine在ASP.NET宿主环境中使用VirtualPathProvider。更糟糕的是,我使用Reflector跟踪了一些其他代码,发现对VirtualPath实用程序的一些硬代码引用存在其他依赖关系。
我希望他们能在发行版中解决这个问题,这样我们才能真正测试我们的视图以及视图的呈现方式。

这些是需要在HttpBrowserCapabilities对象中设置的值,asp.net webforms站点要运行,我会试着确保这些都设置好了,看看这是否能解决您的问题,我不确定是否可以,但是值得一试,对吗

  • 浏览器(又名)
  • useragent(在请求中传递)
  • 表(真/假)
  • 版本(浏览器的版本,如1.0)
  • W3CDOM版本(如1.0)
  • cookies(真/假)
  • ECMAScript版本(如1.0)
希望这对您有所帮助。

我也建议您进行UI测试。标准MVC应用程序中有相当多的部分可以进行单元测试,但UI级组件似乎更适合于像Selenium这样的浏览器内测试。您可以使用将Selenium测试与单元测试集成在一起


下面是一个将Selenium与CC.Net集成的示例。

使用TypeMock模拟依赖项。我已经写过如何模拟控制器层中的请求和响应依赖关系。也许有帮助

很久以前我就放弃了对视图进行单元测试。尝试将所有业务逻辑移动到控制器中,并对其进行单元测试。众所周知,视图对于单元测试来说非常复杂。可能有一个真正的答案,但我不久前就放弃了,因为我们的视图发展得太快了。是的,一般来说,我不想测试我的视图,但当我使用用户控件时,这是一个可重用的部分,经常在整个应用程序中使用,并且没有控制器代码可言。我想测试它是否可以实例化和呈现,并且包含大致正确的内容。据我所知,您实际上正在测试repo.GetMeSomeData(),它一点也不依赖于视图或用户控件。你能检查一下repo.GetMeSomeData()是否提供了你想要的,而不是调用控件吗?嗨,我知道GetMeSomeData是独立测试的,我想测试的是调用的数据在HTML中呈现。谢谢,下次编写代码时,我会尝试一下。接受这个答案,因为它看起来本质上是:不,没有办法对渲染视图的结果进行单元测试。使用selenium、Watin或同等产品是一个很好的选择,但这并不是我真正想要做的——控制/视图输出的无浏览器测试。
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;