2008-11-17 5 views
5

J'essaie de tester une unité dans mon application ASP.NET MVC qui, lorsqu'elle est publiée sur, va supprimer l'élément d'un utilisateur. Je souhaite limiter cette page afin qu'elle ne puisse être publiée que par le propriétaire de l'élément. À l'origine, je voulais juste coller une vérification rapide dans le contrôleur qui a vérifié si le HttpContext.Current.User.Identity.Name est égal au propriétaire de l'élément, mais j'ai rapidement réalisé que tester cet élément serait difficile.Comment annulez-vous User.Identity.Name dans ASP.NET MVC?

Dois-je créer une interface permettant d'accéder au nom de l'utilisateur actuellement connecté?

Répondre

4

La dernière ligne de votre question est probablement la solution la plus rapide, mais je ne pense pas que vous devez créer l'interface, HttpContext.Current.User est déjà un IPrincipal et HttpContext.Current.User.Identity est déjà un IIdentity.

Si votre logique de contrôle utilise l'une de ces interfaces, le contrôleur peut être moquée pour passer un IIdentity que vous créez au lieu du HttpContext.Current.User.Identity

Hope that helps!

2

J'utilise Thread.CurrentPrincipal.Identity.Name. Il est trivial de créer un GenericPrincipal pour un test unitaire et de l'attacher.

5

Vous pouvez utiliser ce code

Controller CreateControllerAs(string userName) { 

    var mock = new Mock<ControllerContext>(); 
    mock.SetupGet(p => p.HttpContext.User.Identity.Name).Returns(userName); 
    mock.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true); 

    var controller = new SomeController(); 
    controller.ControllerContext = mock.Object; 

    return controller; 
} 

Il utilise moq lib

+0

Savez-vous où je peux trouver la classe Mock? J'ai regardé partout dans MSDN essayant de trouver la documentation à ce sujet mais n'ai fait aucun progrès. –

+1

https://code.google.com/p/moq/ cette bibliothèque est utilisée ici – Sly