Подтвердить что ты не робот

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

У меня есть код контроллера ASP.NET MVC, который проверяет подлинность пользователя и если да, он проверяет, имеет ли он конкретное требование. Прекрасно работает.

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

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

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

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

но все это не удается, когда я тестирую это в своем Unit Test.., потому что я не уверен, как я могу mock ClaimsPrincipal

Любые идеи?

4b9b3361

Ответ 1

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

Ответ 2

Отказывание ClaimsPrincipal не слишком сложно

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

Однако в зависимости от того, как ваш контроллер получит доступ к нему. Посмотрите на этот вопрос Как издеваться над контроллером .User с помощью 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();

Ответ 3

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