Я пишу единый тест для метода расширения htmlhelper , но это немного сложно, потому что он вызывает urlhelper внутри метода, а не использование инъекции зависимости. Это означает, что я не могу просто издеваться над Urlhelper .
Итак, в моем тесте я создал объект htmlhelper и издевался над всеми необходимыми свойствами. Я сделал все возможное, чтобы настроить htmlhelper.viewcontext.requestcontext , так как это то, на что полагается Urlhelper , когда он построен. Но когда я его отладил, urlhelper.action вернул null .
Я бы признателен за любые понимания того, что может вызвать эту проблему!
Оригинальный метод:
public static bool IsActive(this HtmlHelper helper, string actionName, string controllerName, string areaName)
{
string currentUrl = helper.ViewContext.HttpContext.Request.RawUrl;
UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext);
string url = urlHelper.Action(actionName, controllerName, new { area = areaName });
return currentUrl.Contains(url);
}
< /code>
Вот моя попытка: < /p>
[Fact]
public void IsActive_WhenUrlIsCurrentUrl_ReturnsTrue()
{
// Arrange
var dictionary = new { action = "Index", controller = "Home", area = "Admin" };
var viewDataDictionary = new ViewDataDictionary(dictionary);
var htmlHelper = MvcHelper.GetHtmlHelperWithPath(viewDataDictionary, "/Home/Index/Admin");
// Act
var result = htmlHelper.IsActive("Index", "Home", "Admin");
// Assert
Assert.True(result);
}
public static class MvcHelper
{
public const string AppPathModifier = "/$(SESSION)";
public static HtmlHelper GetHtmlHelperWithPath(ViewDataDictionary viewData, string appPath)
{
ViewContext viewContext = GetViewContextWithPath(appPath, viewData);
Mock mockContainer = new Mock();
mockContainer.Setup(c => c.ViewData).Returns(viewData);
IViewDataContainer container = mockContainer.Object;
return new HtmlHelper(viewContext, container);
}
public static ViewContext GetViewContextWithPath(string appPath, ViewDataDictionary viewData)
{
HttpContextBase httpContext = GetHttpContext(appPath, "/request", "GET", Uri.UriSchemeHttp.ToString());
Mock mockViewContext = new Mock() { DefaultValue = DefaultValue.Mock };
RouteData rd = new RouteData();
rd.Values.Add("controller", "Home");
rd.Values.Add("action", "Index");
rd.Values.Add("area", "Admin");
mockViewContext.Object.RequestContext = new RequestContext(httpContext, rd);
mockViewContext.Setup(c => c.HttpContext).Returns(httpContext);
mockViewContext.Setup(c => c.ViewData).Returns(viewData);
mockViewContext.Setup(c => c.Writer).Returns(new StringWriter());
return mockViewContext.Object;
}
public static HttpContextBase GetHttpContext(string appPath, string requestPath, string httpMethod, string protocol)
{
Mock mockHttpContext = new Mock();
mockHttpContext.Setup(o => o.Request.ApplicationPath).Returns(appPath);
mockHttpContext.Setup(o => o.Request.RawUrl).Returns(appPath);
mockHttpContext.Setup(o => o.Request.AppRelativeCurrentExecutionFilePath).Returns(requestPath);
Uri uri = new Uri(protocol + "://localhost");
mockHttpContext.Setup(o => o.Request.Url).Returns(uri);
mockHttpContext.Setup(o => o.Request.PathInfo).Returns(String.Empty);
mockHttpContext.Setup(o => o.Request.HttpMethod).Returns(httpMethod);
mockHttpContext.Setup(o => o.Session).Returns((HttpSessionStateBase)null);
mockHttpContext.Setup(o => o.Response.ApplyAppPathModifier(It.IsAny())).Returns(r => AppPathModifier + r);
mockHttpContext.Setup(o => o.Items).Returns(new Hashtable());
return mockHttpContext.Object;
}
}
Подробнее здесь: https://stackoverflow.com/questions/795 ... unit-tests