Próbuję dodać testy jednostkowe do aplikacji ASP.NET MVC, którą zbudowałem. W moich testach jednostkowych używam następującego kodu:
[TestMethod]
public void IndexAction_Should_Return_View() {
var controller = new MembershipController();
controller.SetFakeControllerContext("TestUser");
...
}
Z następującymi pomocnikami do mockowania kontekstu kontrolera:
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;
}
}
Ta klasa testowa dziedziczy z klasy bazowej, która ma następujące elementy:
[TestInitialize]
public void Init() {
...
}
Wewnątrz tej metody wywołuje bibliotekę (nad którą nie mam kontroli), która próbuje uruchomić następujący kod:
HttpContext.Current.User.Identity.IsAuthenticated
Teraz prawdopodobnie widzisz problem. Ustawiłem fałszywy HttpContext względem kontrolera, ale nie w tej podstawowej metodzie Init. Testowanie jednostkowe / mockowanie jest dla mnie nowością, więc chcę się upewnić, że robię to dobrze. Jaki jest prawidłowy sposób, w jaki mogę wyszydzać HttpContext, aby był współdzielony przez mój kontroler i wszystkie biblioteki, które są wywoływane w mojej metodzie Init.
źródło
GenericIdentity
konstruktora,IsAuthenticated
zwróci falseHttpContextBase
, z których można wyszydzać. Nie ma potrzeby korzystania z opublikowanego przeze mnie obejścia, jeśli używasz MVC. Jeśli to zrobisz, prawdopodobnie będziesz musiał uruchomić kod, który opublikowałem, zanim jeszcze utworzysz kontroler.Poniżej Test Init również wykona zadanie.
źródło
System.Web
swojego projektu testowego?Wiem, że to starszy temat, ale mockowanie aplikacji MVC do testów jednostkowych jest czymś, co robimy bardzo regularnie.
Chciałem tylko dodać swoje doświadczenia Mockowanie aplikacji MVC 3 przy użyciu Moq 4 po uaktualnieniu do Visual Studio 2013. Żaden z testów jednostkowych nie działał w trybie debugowania, a HttpContext pokazywał „nie można ocenić wyrażenia” podczas próby zerknięcia na zmienne .
Okazuje się, że w programie Visual Studio 2013 występują problemy z oceną niektórych obiektów. Aby ponownie uruchomić debugowanie fałszywych aplikacji internetowych, musiałem zaznaczyć opcję „Użyj zarządzanego trybu zgodności” w menu Narzędzia => Opcje => Debugowanie => Ustawienia ogólne.
Generalnie robię coś takiego:
I inicjując taki kontekst
I wywołanie metody w kontrolerze prosto do przodu
źródło
Jeśli strona trzecia Twojej aplikacji przekierowuje wewnętrznie, lepiej jest mockować HttpContext w poniższy sposób:
źródło