Mi piacerebbe scrivere (in C#) un test unitario per un'azione del controller MVC che potrebbe restituire una vista o l'altra, a seconda che la richiesta sia autenticata. Come si può fare?Come testare unitamente un'azione del controller MVC che dipende dall'autenticazione in C#?
risposta
È 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");
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();
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
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
- 1. Come testare unitamente un controller JSON?
- 2. Come posso testare unitamente un metodo protetto in C++?
- 3. Possiamo testare unitamente global.asax in asp.net?
- 4. È possibile testare unitamente BundleConfig in MVC4?
- 5. Come testare unitamente le connessioni IBOutlet?
- 6. Come testare unitamente le classi di repository in MVC3?
- 7. Come posso testare unitamente gli URL django?
- 8. Devo testare i miei controller (MVC)?
- 9. Come testare la logica che dipende dalla data corrente
- 10. Come testare un componente che dipende dai parametri di ActivatedRoute?
- 11. come testare unitamente gli script di app di google?
- 12. Come testare unitamente un metodo di annullamento senza argomenti
- 13. Perché è difficile testare un sistema che dipende dai singleton?
- 14. Come testare ModelMetadata.FromLambdaExpression in MVC?
- 15. Come testare unitamente i miei modelli ora che sto usando Core Data?
- 16. Zend Framework 2 come testare il reindirizzamento nell'azione del controller?
- 17. Come testare unitamente un pattern di repository che utilizza Entity Framework?
- 18. Come testare un'unità ActionResult che restituisce ContentResult?
- 19. Come posso testare le viste MVC?
- 20. Durata del controller in primavera MVC
- 21. Come testare le direttive che utilizzano templateUrl e controller?
- 22. Controller MVC che restituisce la codifica del contenuto Chunked
- 23. Come testare i controller con CodeIgniter?
- 24. Come posso testare un ActionFilter in ASP.NET MVC?
- 25. Come possiamo testare i metodi del controller angolare non-scope?
- 26. Come testare i metodi del controller JERSEY con UriInfo
- 27. come faccio a testare il metodo del controller usando rspec?
- 28. Come testare il controller wash_out con Rspec
- 29. ASP.NET MVC Autentica prima del controller istanziato
- 30. Come posso testare unitamente il mio risultato Json in un sito Web ASP.NET MVC3?
pulito. grazie per la tua risposta. ;) – Mats
Questo non funziona per me - restituisce lo stesso viewname indipendentemente da vero/falso – Kev