2009-07-09 5 views

Répondre

31

Vous pouvez simuler votre demande. Quelque chose comme ça (en utilisant Moq):

var request = new Mock<HttpRequestBase>(); 
request.SetupGet(x => x.IsAuthenticated).Returns(true); // or false 

var context = new Mock<HttpContextBase>(); 
context.SetupGet(x => x.Request).Returns(request.Object); 

var controller = new YourController(); 
controller.ControllerContext = 
     new ControllerContext(context.Object, new RouteData(), controller); 

// test 

ViewResult viewResult = (ViewResult)controller.SomeAction(); 

Assert.True(viewResult.ViewName == "ViewForAuthenticatedRequest"); 
+0

soignée. Merci pour votre réponse. ;) – Mats

+0

Cela ne fonctionne pas pour moi - renvoie le même nom de vue indépendamment de vrai/faux – Kev

14

En utilisant moqueuse et l'injection de dépendance. Ce qui suit suppose que vous vérifiez qu'il est authentifié, puis accédez à l'objet utilisateur pour obtenir l'ID de l'utilisateur. Utilise RhinoMocks.

// mock context variables 
var username = "user"; 
var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
var request = MockRepository.GenerateMock<HttpRequestBase>(); 
var identity = MockRepository.GenerateMock<IIdentity>(); 
var principal = MockRepository.GenerateMock<IPrincipal>(); 

httpContext.Expect(c => c.Request).Return(request).Repeat.AtLeastOnce(); 
request.Expect(r => r.IsAuthenticated).Return(true).Repeat.AtLeastOnce(); 
httpContext.Expect(c => c.User).Return(principal).Repeat.AtLeastOnce(); 
principal.Expect(p => p.Identity).Return(identity).Repeat.AtLeastOnce(); 
identity.Expect(i => i.Name).Return(username).Repeat.AtLeastOnce(); 

var controller = new MyController(); 
// inject context 
controller.ControllerContext = new ControllerContext(httpContext, 
                 new RouteData(), 
                 controller); 

var result = controller.MyAction() as ViewResult; 

Assert.IsNotNull(result); 

// verify that expectations were met 
identity.VerifyAllExpectations(); 
principal.VerifyAllExpectations(); 
request.VerifyAllExpectations(); 
httpContext.VerifyAllExpectations(); 
+1

merci pour votre réponse qui je suis sûr fonctionne très bien. Depuis que j'ai testé la réponse eu-ge-ne (qui fonctionne bien pour moi) et il était un peu plus rapide avec la réponse, j'ai marqué sa réponse. sans vouloir vous offenser. bonne journée. ;) – Mats

+1

Pas un problème. C'est vraiment la même réponse. Je n'ai quitté que le mien car il montre comment se moquer du principal/de l'identité au cas où vous auriez besoin d'obtenir le nom d'utilisateur - ou la méthode IsInRole sur le principal, ce que je n'ai pas montré. – tvanfosson

Questions connexes