Ich versuche, einer von mir erstellten ASP.NET MVC-Anwendung Komponententests hinzuzufügen. In meinen Unit-Tests verwende ich den folgenden Code:
[TestMethod]
public void IndexAction_Should_Return_View() {
var controller = new MembershipController();
controller.SetFakeControllerContext("TestUser");
...
}
Mit den folgenden Helfern, um den Controller-Kontext zu verspotten:
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;
}
}
Diese Testklasse erbt von einer Basisklasse mit folgenden Eigenschaften:
[TestInitialize]
public void Init() {
...
}
Innerhalb dieser Methode ruft es eine Bibliothek auf (über die ich keine Kontrolle habe), die versucht, den folgenden Code auszuführen:
HttpContext.Current.User.Identity.IsAuthenticated
Jetzt können Sie wahrscheinlich das Problem sehen. Ich habe den gefälschten HttpContext gegen den Controller gesetzt, aber nicht in dieser Basis-Init-Methode. Unit Testing / Mocking ist für mich sehr neu, deshalb möchte ich sicherstellen, dass ich das richtig mache. Wie kann ich den HttpContext richtig verspotten, damit er von meinem Controller und allen Bibliotheken, die in meiner Init-Methode aufgerufen werden, gemeinsam genutzt wird?
quelle
GenericIdentity
Konstruktor übergeben,IsAuthenticated
wird false zurückgegebenHttpContextBase
, die verspottet werden können. Wenn Sie MVC verwenden, müssen Sie die von mir veröffentlichte Problemumgehung nicht verwenden. Wenn Sie damit fortfahren, müssen Sie wahrscheinlich den von mir veröffentlichten Code ausführen, bevor Sie den Controller überhaupt erstellen .Unter Test Init wird auch die Arbeit erledigen.
quelle
System.Web
in Ihrem Testprojekt einen Verweis darauf ?Ich weiß, dass dies ein älteres Thema ist, aber wir verspotten eine MVC-Anwendung für Unit-Tests sehr regelmäßig.
Ich wollte nur meine Erfahrungen hinzufügen. Verspotten einer MVC 3-Anwendung mit Moq 4 nach dem Upgrade auf Visual Studio 2013. Keiner der Komponententests funktionierte im Debug-Modus, und der HttpContext zeigte an, dass beim Versuch, einen Blick auf die Variablen zu werfen, "Ausdruck konnte nicht ausgewertet werden" .
Es stellt sich heraus, dass Visual Studio 2013 Probleme bei der Bewertung einiger Objekte hat. Damit das Debuggen verspotteter Webanwendungen wieder funktioniert, musste ich unter Extras => Optionen => Debuggen => Allgemeine Einstellungen den "Verwalteten Kompatibilitätsmodus verwenden" aktivieren.
Ich mache im Allgemeinen so etwas:
Und den Kontext so initiieren
Und die Methode im Controller direkt aufrufen
quelle
Wenn Ihre Anwendung von Drittanbietern intern umgeleitet wird, ist es besser, HttpContext wie folgt zu verspotten:
quelle