11

Ho qualche codice del controller ASP.NET MVC che controlla se un utente è autenticato e, in caso affermativo, controlla se ha un reclamo specifico. Funziona bene.Esiste un modo per deridere un preside Claims nella mia applicazione Web ASP.NET MVC?

Ho alcuni test di unità e ho bisogno di prendere in giro un IPrincipal (che è facile da fare) ... ma non sono sicuro come controllare le affermazioni! Faccio di solito qualcosa di simile

public static ClaimsPrincipal ClaimsPrincipal(this Controller controller) 
{ 
    return controller.User as ClaimsPrincipal; 
} 

e un codice di controllo ...

this.ClaimsPrincipal().HasClaim(x => x.......); 

ma tutto questo viene a mancare quando prova questo nel mio Unit Test .. perchè io non sono sicuro di come posso mock the ClaimsPrincipal

Qualche idea?

risposta

3

Anche la maggior parte dei metodi sono virtuali, quindi quelli sono simulabili.

6

Non sono sicuro di cosa intendi con "finto". Ma puoi semplicemente creare un ClaimsPrincipal da zero. Crea innanzitutto ClaimsIdentity: aggiungi le attestazioni e il metodo di autenticazione necessari. Quindi avvolgilo con un ClaimsPrincipal.

10

Mocking il ClaimsPrincipal costerà troppo difficile

var cp = new Mock<ClaimsPrincipal>(); 
cp.Setup(m => m.HasClaim(It.IsAny<string>(),It.IsAny<string>())) 
    .Returns(true); 

Tuttavia a seconda di come l'accesso guadagni controller per lo farà. Date un'occhiata a questa domanda How to mock Controller.User using moq

che darebbe qualcosa di simile:

var cp = new Mock<ClaimsPrincipal>(); 
cp.Setup(m => m.HasClaim(It.IsAny<string>(), It.IsAny<string>())).Returns(true); 

var sut = new UtilityController(); 

var contextMock = new Mock<HttpContextBase>(); 
contextMock.Setup(ctx => ctx.User).Returns(cp.Object); 

var controllerContextMock = new Mock<ControllerContext>(); 
controllerContextMock.Setup(con => con.HttpContext).Returns(contextMock.Object); 

sut.ControllerContext = controllerContextMock.Object; 

var viewresult = sut.Index(); 
Problemi correlati