Ответ 1
Что вы можете сделать, так это:
HtmlHelper helper = null;
helper.YourHelperMethod();
Не нужно ничего издеваться. Работает блестяще для меня.
Может кто-нибудь показать мне, как вы собираетесь создавать mock HTML Helper с Moq?
В этой статье есть ссылка на статью, претендующую на это, но после ссылки возвращается только ошибка времени выполнения ASP.NET
[править] Я задал более конкретный вопрос, связанный с тем же вопросом здесь, но он не получил никаких ответов. Я полагал, что это слишком специфично, поэтому я подумал, что могу получить более общий ответ на более общий вопрос и изменить его в соответствии с моими требованиями.
Спасибо
Что вы можете сделать, так это:
HtmlHelper helper = null;
helper.YourHelperMethod();
Не нужно ничего издеваться. Работает блестяще для меня.
Здесь другая статья, которая показывает вам, как достичь того же:
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); }
В 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);
}
Для тестирования одноразового помощника, такого как 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);
}