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?