Как выполнить модульное тестирование HtmlHelper с Moq? - PullRequest
34 голосов
/ 23 марта 2010

Может ли кто-нибудь показать мне, как вы будете создавать фиктивный HTML Helper с Moq?

Эта статья содержит ссылку на статью, в которой утверждается, что она описана, но по этой ссылке возвращается только ошибка времени выполнения ASP.NET

[править] Я задал более конкретный вопрос, относящийся к той же теме здесь , но он не получил никаких ответов. Я подумал, что это слишком конкретно, поэтому подумал, что смогу получить более общий ответ на более общий вопрос и изменить его в соответствии со своими требованиями.

Спасибо

Ответы [ 4 ]

45 голосов
/ 23 марта 2010

Вот еще одна статья , в которой показано, как добиться того же:

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);
}
19 голосов
/ 06 февраля 2014

В MVC5 ViewContext имеет дополнительный параметр конструктора для TextWriter, поэтому код Томаса больше не работает.Я добавил 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);
}
13 голосов
/ 06 августа 2010

Что вы можете сделать, это:

HtmlHelper helper = null;
helper.YourHelperMethod();

Не надо издеваться над чем-либо. Работает отлично для меня.

1 голос
/ 22 февраля 2015

Для проверки одноразового помощника, такого как BeginForm, с доступом к ViewContext.Writer вы можете использовать это:

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