2009-12-09 5 views
26

J'ai cherché stackoverflow et googlé quatre heures quelques heures et toujours pas trouvé de solution pour mon problème "trivial".Comment puis-je tester une méthode de contrôleur avec l'attribut [Autoriser] appliqué?

Si vous écrivez un test unitaire pour votre [Authorize] ActionResult filtré, comment résolvez-vous le problème pour simuler que l'utilisateur est authentifié?

J'ai beaucoup de ActionResult méthodes qui sont filtrées avec [Authorize] et je veux tester tous mes ActionResult méthodes peu importe si elles sont filtrées avec [Authorize] ou non.

Un exemple simple de ce que je veux dire:

[TestMethod] 
public void Create_Get_ReturnsView() 
{ 
// Arrange 
var controller = new UserController(); 
// Act 
var result = controller.Create(); 
// Assert 
Assert.IsNotNull(result as ViewResult); 
} 

[Authorize] 
public ActionResult Create() 
{ 
return View("Create"); 
} 

A partir de maintenant les tests ne même pas frappé la méthode ActionResult en raison de la [Authorize] filtre, exception levée est: System.NullReferenceException: Object reference not set to an instance of an object.

+1

Il y a quelque chose que vous ne nous montrez pas. Le test que vous montrez n'exécutera * * aucun filtre d'action. Peut-être avez-vous du code qui le fera, mais ce n'est pas dans votre question. Que diriez-vous de l'ensemble de la pile d'appel pour l'erreur, pour les débutants? –

Répondre

25

Vous besoin de se moquer d'un contexte pour votre contrôleur. Essayez d'utiliser Moq

Votre arranger doit ressembler à:

var controller = new UserController(); 
var mock = new Mock<ControllerContext>(); 
mock.SetupGet(x => x.HttpContext.User.Identity.Name).Returns("SOMEUSER"); 
mock.SetupGet(x => x.HttpContext.Request.IsAuthenticated).Returns(true); 
controller.ControllerContext = mock.Object; 

Vous devriez pouvoir ensuite faire votre loi & Assertion.

Si vous ne l'avez pas déjà fait, je vous recommande fortement de parcourir NerdDinner comme exemple de site MVC.

+0

Awsome, cela a fonctionné sans faille ... Merci beaucoup – Webking

+0

Je pourrais faire valoir que vous n'avez pas besoin de vraiment tester cela du tout. L'attribut est déjà bien testé par l'équipe qui a écrit ASP.NET MVC. Vous pouvez télécharger la source et voir par vous-même. –

+8

Il ne s'agit pas de tester l'attribut '[Authorized]', c'est de le contourner pour tester les méthodes 'ActionResult' – AndyMcKenna