Я пытаюсь добавить модульное тестирование в приложение ASP.NET MVC, которое я создал. В моих модульных тестах я использую следующий код:
[TestMethod]
public void IndexAction_Should_Return_View() {
var controller = new MembershipController();
controller.SetFakeControllerContext("TestUser");
...
}
С помощью следующих помощников для макета контекста контроллера:
public static class FakeControllerContext {
public static HttpContextBase FakeHttpContext(string username) {
var context = new Mock<HttpContextBase>();
context.SetupGet(ctx => ctx.Request.IsAuthenticated).Returns(!string.IsNullOrEmpty(username));
if (!string.IsNullOrEmpty(username))
context.SetupGet(ctx => ctx.User.Identity).Returns(FakeIdentity.CreateIdentity(username));
return context.Object;
}
public static void SetFakeControllerContext(this Controller controller, string username = null) {
var httpContext = FakeHttpContext(username);
var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = context;
}
}
Этот тестовый класс наследует от базового класса, который имеет следующее:
[TestInitialize]
public void Init() {
...
}
Внутри этого метода он вызывает библиотеку (которую я не могу контролировать), которая пытается запустить следующий код:
HttpContext.Current.User.Identity.IsAuthenticated
Теперь вы, вероятно, можете увидеть проблему. Я установил поддельный HttpContext против контроллера, но не в этом базовом методе Init. Модульное тестирование / макет для меня очень новое, поэтому я хочу убедиться, что я правильно понял. Какой правильный способ для меня макетировать HttpContext, чтобы он был общим для моего контроллера и любых библиотек, которые вызываются в моем методе Init.
источник
GenericIdentity
конструктор,IsAuthenticated
вернет falseHttpContextBase
, который можно поиздеваться. Нет необходимости использовать обходной путь, который я опубликовал, если вы используете MVC. Если вы пойдете дальше, вам, вероятно, потребуется запустить код, который я разместил, прежде чем вы даже создадите контроллер.Ниже Test Init также сделает эту работу.
источник
System.Web
ваш тестовый проект?Я знаю, что это более старая тема, однако мы регулярно используем Mocking для приложения MVC для модульных тестов.
Я просто хотел добавить свой опыт. Пересмотр приложения MVC 3 с использованием Moq 4 после обновления до Visual Studio 2013. Ни один из модульных тестов не работал в режиме отладки, и HttpContext показывал «не удалось оценить выражение» при попытке взглянуть на переменные. ,
Оказывается, у Visual Studio 2013 есть проблемы с оценкой некоторых объектов. Чтобы отладка макетированных веб-приложений снова работала, мне нужно было проверить «Использовать режим управляемой совместимости» в Сервис => Параметры => Отладка => Общие настройки.
Я обычно делаю что-то вроде этого:
И инициирование контекста, как это
И вызов метода в контроллере прямо
источник
Если ваше приложение стороннего перенаправляет изнутри, то лучше смоделировать HttpContext следующим образом:
источник