11

У меня есть код контроллера ASP.NET MVC, который проверяет подлинность пользователя и если да, он проверяет, имеет ли он конкретное требование. Работает отлично.Можно ли каким-либо образом высмеять Принцип претензий в моем веб-приложении ASP.NET MVC?

У меня есть модульные тесты, и мне нужно высмеять IPrincipal (что легко сделать) ... но я не уверен, как проверить претензии! Я обычно делаю что-то вроде

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

и некоторый код контроллера ...

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

, но все это терпит неудачу, когда я проверить это в моем тесте единицы .. потому что я не знаю, как я могу mockClaimsPrincipal

Любые идеи?

ответ

3

Также большинство методов являются виртуальными, поэтому они являются макетными.

6

Я не уверен, что вы имеете в виду «макет». Но вы можете просто создать ClaimsPrincipal с нуля. Сначала создайте свойство ClaimsIdentity - добавьте требуемые требования и метод аутентификации. Затем заверните его в ClaimsPrincipal.

10

насмешливый ClaimsPrincipal разве слишком трудно

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

Однако в зависимости от того, как ваш контроллер получает доступ к нему будет. Посмотрите на этот вопрос How to mock Controller.User using moq

который даст вам что-то вроде этого:

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();