2009-07-09 18 views

risposta

31

È possibile prendere in giro la richiesta. Qualcosa di simile (Moq usando):

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

pulito. grazie per la tua risposta. ;) – Mats

+0

Questo non funziona per me - restituisce lo stesso viewname indipendentemente da vero/falso – Kev

14

Utilizzando beffardo e l'iniezione di dipendenza. Quanto segue presuppone che tu stia verificando che sia autenticato e quindi accedendo all'oggetto utente per ottenere l'id dell'utente. Utilizza 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

grazie per la tua risposta che sono sicuro che funziona in modo eccellente. da quando ho testato la risposta eu-ge-ne (che funziona bene per me) e lui è stato un po 'più veloce con la risposta, ho segnato la sua risposta. senza offesa. buona giornata. ;) – Mats

+1

Non è un problema. È davvero la stessa risposta. Ho lasciato il mio solo perché mostra come schernire il principal/identità nel caso in cui sia necessario ottenere il nome utente o il metodo IsInRole sul principal, che non ho mostrato. – tvanfosson

Problemi correlati