Я пытаюсь написать некоторые модульные тесты для следующего метода расширения, который используется в веб-приложении .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, поэтому вполне возможно, что настройка макетанеправильно?Или, возможно, есть другой способ установить значения, чтобы тест работал правильно?Буду очень признателен за любые советы о том, как этого добиться.