Нет простого способа проверить хелпер.Акция, вызвала ли она правильные параметры. Это связано с тем, что, поскольку некоторые из замечаний указывают на то, что HtmlHelper не является насмешливым, а также действием, которое также является статическим расширением. НО вы можете использовать обходной тест определенного сценария, например, согласно вашему вопросу.
это просто требует тест, который может высмеивать метод действий, чтобы вернуть то, в частности, так что можно утверждать, что это вызывается с правильными параметрами.
Хотя это не совсем возможно из-за статического характера, мы могли бы использовать другой метод, чтобы проверить, было ли вызвано действие с правильными параметрами.
Это просто руководство, и я не полностью проверил свой код. Я знаю, что это будет работать в тестовом контексте, но я не совсем уверен, что это приведет к правильному результату во время выполнения производственного кода. Если нет, я с удовольствием посмотрю на это снова.
Сначала я бы создал класс, который позволяет мне переопределить метод helper.Action.
public class HtmlHelperActionInvoker {
public virtual MvcHtmlString InvokeAction(HtmlHelper helper, string action, string controller) {
return helper.Action(action, controller);
}
}
Затем в Html вспомогательный класс Я хотел бы добавить статический конструктор и делегат/FUNC, который позволяет мне установить свою собственную версию HtmlHelpActionInvoker во время выполнения теста.
public static class SomeHtmlHelperClass
{
static SomeHelperClass() {
HtmlHelperActionFunc =() => new HtmlHelperActionInvoker();
}
public static Func<HtmlHelperActionInvoker> HtmlHelperActionFunc { get; set; }
public static MvcHtmlString RenderCMSObject(this HtmlHelper helper, CMSObject cmsObject)
{
var actionName = string.IsNullOrEmpty(cmsObject.ActionName)
? "Index"
: cmsObject.ActionName;
var controllerName = string.IsNullOrEmpty(cmsObject.ControllerName)
? "Default"
: cmsObject.ControllerName;
var helperAction = HtmlHelperActionFunc();
return helperAction.InvokeAction(helper, actionName, controllerName);
}
}
Я считаю, что статический ctro будет выполнять один раз и установить экземпляр HtmlHelperActionInvoker один раз во время выполнения producion кода. Последующие запросы будут повторно использовать этот экземпляр. (Как я уже говорил прежде, чем Вы, вероятно, нужно проверить это больше)
Теперь Unit Test
Мы будем использовать технику, называемую Extract & Override.
В тестовой области создайте тестовую версию HtmlHelperActionInvoker. Это НЕ поддельный объект/заглушка/макет. Это проверенная версия HtmlHelperActionInvoker. И использовать только метод, который был вызван с ожидаемыми параметрами.
public class TesatableHtmlHelperAction : HtmlHelperActionInvoker
{
public string Controller { get; set; }
public string Action { get; set; }
public override MvcHtmlString InvokeAction(HtmlHelper helper, string action, string controller) {
Action = action;
Controller = controller;
return new MvcHtmlString("");
}
}
В модульном тесте мы установили бы тестируемый TesatableHtmlHelperAction так SUT (System Test меньше) будет выполнять проверяемую версию. (Примечания: по-прежнему рассматривается как реальные, как мы переопределять поведение реального HtmlHelperActionInvoker)
[TestMethod]
public void HtmlHelperActionRenderCMSObject_Execute_EnsureInvokeActionCalledWithExpectedControlerAndActionName()
{
//Arrange
var fakecmsObject = new CMSObject() { ActionName = "foo", ControllerName = "bar" };
var testableHtmlHelperAction = new TesatableHtmlHelperAction();
SomeHelperClass.HtmlHelperActionFunc =() => testableHtmlHelperAction;
// Act
SomeHelperClass.RenderCMSObject(null, fakecmsObject);
// Verify
Assert.AreEqual<string>(fakecmsObject.ActionName, testableHtmlHelperAction.Action);
Assert.AreEqual<string>(fakecmsObject.ControllerName, testableHtmlHelperAction.Controller);
}
Какое поведение вы испытываете? –
Что HTML-помощник выполнит действие с правильным именем действия и именем контроллера. Фактический вспомогательный метод более сложный, чем пример, но я упростил его, чтобы показать только область, требующую утверждения. – makit
Обычно проверяются модульные тесты для проверки некоторого поведения, отличного от простого прохождения параметров. Вот почему мы обычно не тестируем автоматические свойства; мы просто предполагаем, что они работают. Тесты интеграции будут охватывать это. –