J'essaie d'ajouter des tests unitaires à une application ASP.NET MVC que j'ai construite. Dans mes tests unitaires, j'utilise le code suivant :
[TestMethod]
public void IndexAction_Should_Return_View() {
var controller = new MembershipController();
controller.SetFakeControllerContext("TestUser");
...
}
Avec les aides suivantes pour simuler le contexte du contrôleur :
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;
}
}
Cette classe de test hérite d'une classe de base qui présente les caractéristiques suivantes :
[TestInitialize]
public void Init() {
...
}
Cette méthode appelle une bibliothèque (sur laquelle je n'ai aucun contrôle) qui tente d'exécuter le code suivant :
HttpContext.Current.User.Identity.IsAuthenticated
Maintenant, vous pouvez probablement voir le problème. J'ai défini le faux HttpContext dans le contrôleur mais pas dans la méthode de base Init. Les tests unitaires et le mocking sont très nouveaux pour moi, je veux donc être sûr de bien faire les choses. Quelle est la manière correcte de simuler le HttpContext de sorte qu'il soit partagé par mon contrôleur et toutes les bibliothèques appelées dans ma méthode Init.