如何使用Moq对HtmlHelper进行单元测试?

Dav*_*Dev 34 asp.net-mvc nunit unit-testing html-helper moq

有人可以告诉我如何使用Moq创建模拟HTML Helper吗?

文章有一篇文章的链接自称为说明这一点,但仅之后返回一个ASP.NET运行时错误链接

[编辑] 我问有关同一主题的一个更具体的问题在这里,但目前还没有得到任何回应.我认为它太具体了,所以我想我可以得到一个更一般的问题的更一般的答案,并修改它以满足我的要求.

谢谢

Tho*_*mas 45

是另一篇文章,向您展示如何实现相同的目标:

public static HtmlHelper CreateHtmlHelper(ViewDataDictionary vd)
{
  var mockViewContext = new Mock<ViewContext>(
    new ControllerContext(
      new Mock<HttpContextBase>().Object,
      new RouteData(),
      new Mock<ControllerBase>().Object),
    new Mock<IView>().Object,
    vd,
    new TempDataDictionary());

  var mockViewDataContainer = new Mock<IViewDataContainer>();
  mockViewDataContainer.Setup(v => v.ViewData).Returns(vd);

  return new HtmlHelper(mockViewContext.Object, mockViewDataContainer.Object);
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案.这个对象实际上是在这里嘲笑的. (5认同)
  • 此代码仅适用于MVC4而不适用于MVC5. (2认同)

Cod*_*gue 19

在MVC5中,a ViewContext有一个额外的构造函数参数TextWriter,因此Thomas的代码不再有效.我添加了一个内存中的TextWriter来解决这个问题:

public static HtmlHelper CreateHtmlHelper(ViewDataDictionary vd)
{
    Mock<ViewContext> mockViewContext = new Mock<ViewContext>(
        new ControllerContext(
            new Mock<HttpContextBase>().Object,
            new RouteData(),
            new Mock<ControllerBase>().Object
        ),
        new Mock<IView>().Object,
        vd,
        new TempDataDictionary(),
        new StreamWriter(new MemoryStream())
    );

    Mock<IViewDataContainer> mockDataContainer = new Mock<IViewDataContainer>();
    mockDataContainer.Setup(c => c.ViewData).Returns(vd);

    return new HtmlHelper(mockViewContext.Object, mockDataContainer.Object);
}
Run Code Online (Sandbox Code Playgroud)

  • 这里对`ViewContext`有什么用?似乎从未使用`vc`. (2认同)

MrW*_*MrW 13

你能做的是:

HtmlHelper helper = null;
helper.YourHelperMethod();
Run Code Online (Sandbox Code Playgroud)

不需要嘲笑任何东西.对我来说很棒.

  • 这只有在你编写了一个根本不使用帮助器的辅助方法时才有效.如果你试图访问`ViewContext`,`RouteCollection`或其他任何东西,这对你没有帮助. (31认同)
  • 这不应该是公认的答案.它只回答一个场景,而不是你必须使用Html Helper的情况.就像@MattEnright说的那样,如果您需要使用测试Html Helper来生成Action Link,它将无法帮助您. (4认同)
  • 这个答案完全忽略了尝试在您正在测试的方法中实际使用HtmlHelper的现实.听起来像生成NullReferenceException的好方法. (2认同)