2009-12-14 5 views
3

J'essaie de tester le User.IsInRole ("Administrator") dans mon application, et essaye actuellement d'assigner le rôle utilisateur ("Administrateur") pour que mon test passe . J'utilise MvcMockHelpers de Scott Hanselman pour le faire, et pour l'instant j'ai le test suivant.Test du User.IsInRole dans MVC.NET

[Test] 
    public void Create_CanInsertNewArticleView_IsNotNull() 
    { 
     // Arrange 
     var controller = new ArticleController(); 

     MockRepository mockRepo = new MockRepository(); 
     var fakeContext = MvcMockHelpers.FakeHttpContext(mockRepo, "~/Article/Create"); 
     fakeContext.User.IsInRole("Administrator"); 

     // Act 
     Article fakeArticle = FakeObjects.ReturnFakeArticle(); 

     var result = controller.Create(fakeArticle) as ViewResult; 

     // Assert 
     Assert.IsNotNull(result); 
    } 

Cependant, l'utilisateur du contrôleur actuel est null pour le moment.

Quelqu'un peut-il me aider et me dire ce que le critère approprié devrait être, à User.IsInRole("Administrator")

Merci pour votre aide et le temps

Johann

+0

Par ailleurs, quel cadre de moqueur utilisez-vous? J'ai juste supposé Moq, mais peut-être que c'est Rhino ou TypeMock? –

+0

J'utilise Rhino Mocks, mais assez nouveau – Johann

Répondre

1

Voir this related answer pour plus de détails.


est ici l'extrait de code de l'autre réponse convertie en Rhino Mocks:

var user = new GenericPrincipal(new GenericIdentity(string.Empty), null); 
var httpCtx = MockRepository.GenerateStub<HttpContextBase>(); 
httpCtx.User = user; 

var controllerCtx = new ControllerContext(); 
controllerCtx.HttpContext = httpCtx; 

sut.ControllerContext = controllerCtx; 
+0

J'ai aussi essayé var utilisateur = new GenericPrincipal (new GenericIdentity (string.Empty), null); var httpCtxStub = nouveau Mock (); httpCtxStub.SetupGet (ctx => ctx.User) .Retours (utilisateur); var controllerCtx = nouveau ControllerContext(); controllerCtx.HttpContext = httpCtxStub.Object; sut.ControllerContext = controllerCtx; mais ne fonctionnerait pas, je pense que son Moq non?J'utilise Rhino Mocks – Johann

+0

Oui, cet autre exemple utilise Moq, mais j'ai maintenant édité ma réponse pour inclure le code converti en Rhino Mocks. –

+0

merci Mark Qu'est-ce que sut dans cette ligne? sut.ControllerContext = controllerCtx; – Johann

0

Vous aurez à se moquer d'un IPrincipal pour votre objet utilisateur, le configurer de sorte que .IsInRole("Administrator") retours true et puis définissez votre fakeContext pour renvoyer ce IPrincipal pour la propriété .User. Ce serait quelque chose comme ceci:

EDIT: Il se trouve que l'OP utilise Rhino Mocks, et le code I fourni était pour Moq. Voici une tentative d'écriture de code Rhino, bien que je n'ai jamais utilisé Rhino moi-même. Le code Moq d'origine peut être trouvé ci-dessous.

Dans Rhino Mocks, vous voulez ajouter une autre méthode d'aide, ou changer l'actuel, vous avez donc les suivantes:

public static HttpContextBase FakeHttpContext(this MockRepository mocks, string url, IPrincipal user) 
{ 
     // Do the same setup as Scott does... 

     // ...and add this: 
     SetupResult.For(context.User).Return(user); 

     mocks.Replay(context); 
     return context, 
} 

Ensuite, vous déclarez et configurer votre objet fantaisie IPrincipal comme ça avant l'appel à FakeHttpContext, et envoyer l'objet maquette dans le troisième paramètre.


En Moq:

fakeContext = MvcMockHelpers.FakeHttpContext("~/Article/Create"); 
fakeUser = new Mock<IPrincipal>(); 
fakeUser.Expect(usr => usr.IsInRole(It.IsAny<String>())).Returns(true); 
fakeContext.Expect(context => context.User).Returns(fakeUser.Object); 

(non-responsabilité:. Ce fut un moment que je l'ai écrit un test unitaire, et ce code n'a pas été testé, même pour les erreurs de compilation Par conséquent, il pourrait y avoir les rides qui doivent être aplanies avant que vous puissiez utiliser ce code, mais vous obtenez l'idée générale ...)

+0

J'ai essayé d'ajouter ce SetupResult.For (fakeContext.User.IsInRole ("Administrator")). Retour (vrai); Mais il échoue encore sur cette ligne – Johann

+0

AH, désolé! Les arguments des méthodes '.Expect()' devraient bien sûr être des expressions lambda. Je ne reconnais pas la syntaxe 'SetupResult.For (...). Return (...)', mais c'est probablement la même chose là - vous avez besoin d'un lambda. Essayez de remplacer 'fakeContext' (dans le code de votre commentaire, pas partout ailleurs) avec' ctx => ctx'. Si cela ne fonctionne pas, essayez d'utiliser les méthodes '.Expect()' que j'ai suggérées à la place. –

+0

Salut Tomas, J'ai essayé votre solution var fakeUser = mockRepo.StrictMock (); fakeUser.Expect (usr => usr.IsInRole (It.IsAny ())). Renvoie (true); fakeContext.Expect (context => context.User) .Returns (fakeUser.Object); Cependant, j'ai un problème avec cela dans fakeUser.Expect (usr => usr.IsInRole (It.IsAny ())). Renvoie (true); et aussi les retours dans fakeContext.Expect (context => context.User) .Returns (fakeUser.Object); – Johann