Подтвердить что ты не робот

Как Unit Test HtmlHelper с Moq?

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

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

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

Спасибо

4b9b3361

Ответ 1

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

HtmlHelper helper = null;
helper.YourHelperMethod();

Не нужно ничего издеваться. Работает блестяще для меня.

Ответ 2

Здесь другая статья, которая показывает вам, как достичь того же:

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

Ответ 3

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

Ответ 4

Для тестирования одноразового помощника, такого как 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);
}