Как настроить requestContext для UrlHelper в модульных тестах ASP.NETC#

Место общения программистов C#
Ответить
Anonymous
 Как настроить requestContext для UrlHelper в модульных тестах ASP.NET

Сообщение Anonymous »

Я пишу единый тест для метода расширения 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»