开发者

How to Unit Test HtmlHelper with Moq?

开发者 https://www.devze.com 2022-12-24 06:52 出处:网络
Could somebody show m开发者_C百科e how you would go about creating a mock HTML Helper with Moq? This article has a link to an article claiming to describe this, but following the link only returns an

Could somebody show m开发者_C百科e how you would go about creating a mock HTML Helper with Moq?

This article has a link to an article claiming to describe this, but following the link only returns an ASP.NET Runtime Error

[edit] I asked a more specific question related to the same subject here, but it hasn't gotten any responses. I figured it was too specific, so I thought I could get a more general answer to a more general question and modify it to meet my requirements.

Thanks


Here's another article that shows you how to achieve the same thing:

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);
}


In MVC5, the ViewContext has an extra constructor parameter for a TextWriter, so Thomas' code no longer works. I added an in-memory TextWriter to get around this problem:

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);
}


What you can do is this:

HtmlHelper helper = null;
helper.YourHelperMethod();

No need to mock anything. Works brilliant for me.


To test disposable helper like BeginForm with access to ViewContext.Writer you can use this:

public static HtmlHelper CreateHtmlHelper(ViewDataDictionary vd, Stream stream = null)
{
    TextWriter textWriter = new StreamWriter(stream ?? new MemoryStream());
    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(),
        textWriter
    );
    mockViewContext.Setup(vc => vc.Writer).Returns(textWriter);

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

    return new HtmlHelper(mockViewContext.Object, mockDataContainer.Object);
}
0

精彩评论

暂无评论...
验证码 换一张
取 消