Как проверить метод расширения на HtmlHelper, который требует макетирования RouteData.Values - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь написать некоторые модульные тесты для следующего метода расширения, который используется в веб-приложении .NET core 2.2 MVC:

public static string IsSelected(this IHtmlHelper htmlHelper, string controllers, string actions = null, string cssClass = "active")
{
    string currentAction = htmlHelper.ViewContext.RouteData.Values["action"] as string;
    string currentController = htmlHelper.ViewContext.RouteData.Values["controller"] as string;

    IEnumerable<string> acceptedActions = (actions ?? currentAction).Split(',');
    IEnumerable<string> acceptedControllers = (controllers ?? currentController).Split(',');

    if(actions != null)
    {
        return acceptedActions.Contains(currentAction) && acceptedControllers.Contains(currentController) ? cssClass : String.Empty;
    }

    return acceptedControllers.Contains(currentController) ? cssClass : String.Empty;
}

Как вы увидите, он проверяет значенияRouteData.Values["action"] и RouteData.Values["controller"] из текущего ViewContext и возвращает заданную строку, если они совпадают.

Пока мой модульный тест выглядит так:

public void TestIsSelected()
{
    var htmlHelperMock = new Mock<IHtmlHelper>();

    htmlHelperMock.Setup(m => m.ViewContext.RouteData.Values["action"]).Returns("Index");
    htmlHelperMock.Setup(m => m.ViewContext.RouteData.Values["controller"]).Returns("Home");

    var actualPass = Extensions.IsSelected(htmlHelperMock.Object, "Home");
    var actualFail = Extensions.IsSelected(htmlHelperMock.Object, "Test");

    Assert.AreEqual("active", actualPass);
    Assert.AreEqual(string.Empty, actualFail);
}

ОднакоКажется, установка значений RouteData.Values[] таким способом невозможна, так как при выполнении теста генерируется следующее сообщение об ошибке:

Message: Test method ExtensionsTests.TestIsSelected threw exception: 
System.NotSupportedException: Invalid setup on a non-virtual (overridable in VB) member: m => m.Values["action"]

У меня ограниченный опыт работы с Moq, поэтому вполне возможно, что настройка макетанеправильно?Или, возможно, есть другой способ установить значения, чтобы тест работал правильно?Буду очень признателен за любые советы о том, как этого добиться.

...