Simon_Whale Ответов: 1

Тестирование метода контроллера с помощью токена JWT bearer token


Мне нужна помощь с издевательствами над модульными тестами.

Я пытаюсь вызвать метод в контроллере WebApi, который имеет атрибут авторизации на нем, например

[Authorize]
[HttpGet]
[ActionName("FineOutcome")]
[ProducesResponseType(typeof(Response), 200)]
[ProducesResponseType(401)]
public async Task<IActionResult> FineOutcome(string PCN, int ia)
{
  //Code Action here
}


Авторизация осуществляется с помощью токена на предъявителя JWT. Теперь я пытаюсь протестировать этот метод и не могу / не знаю, как издеваться или передавать токен носителя JWT.

Что я уже пробовал:

var userMock = new Mock<IPrincipal>();
userMock.Setup(p => p.IsInRole("admin")).Returns(true);

var contextMock = new Mock<HttpContext>();
contextMock.Setup(x => x.User ).Returns(new ClaimsPrincipal());

controller.ControllerContext.HttpContext = contextMock.Object;
var outcome = controller.FineOutcome("513073/372796", 467);


но когда я пытаюсь получить execute the test, метод контроллера жалуется, что пользователь пуст. Может ли кто-нибудь указать мне правильное направление?

Ссылки, которые я пробовал

c# - как издеваться над контроллером.Пользователь, использующий moq - Stack Overflow[^]
c# - модульное тестирование токена JWT с помощью Web API - переполнение стека[^]

1 Ответов

Рейтинг:
2

F-ES Sitecore

Модульные тесты предназначены для тестирования вашего кода, а насмешки-для замены частей функциональности, предоставляемых третьими сторонами, которые не работают в вашей тестовой среде (хорошим примером является HttpContext, ваши модульные тесты не выполняются в контексте веб-сайта), или которые вам нужно контролировать результаты.

Короче говоря вы пытаетесь заставить атрибут authorize работать это вы тестируете его основу asp.net фреймворк, но вы должны предположить, что Microsoft уже протестировала его и что он работает, поэтому вместо этого вам следует сосредоточиться на тестировании вашего кода.

If your code is getting the user from some form of httpcontext that that is your actual problem; getting back to what I've said above your unit tests should not rely on environmental things such as contexts, sessions, databases, networks etc, your tests need to run self-contained and in isolation. Change your code such that it gets the user via some sort of service class that you inject into the controller, and your unit test will then mock that service to provide a hard-coded user, however when the code is working on the real site the controller will have a proper user service injected that gets the user from the httpcontext, or wherever it currently gets it from.


Simon_Whale

Спасибо F-ES Sitecore.

То, что я пытаюсь сделать,-это убедиться, что после запуска моих модульных тестов я могу запустить тест интеграции / службы, чтобы убедиться, что все они работают вместе счастливо, поскольку сотрудник сделал некоторые рефакторы, модульные тесты работали успешно, но они не работали, когда сайт был запущен полностью.

F-ES Sitecore

Вы не используете модульное тестирование для этого, у вас есть другой набор тестов для интеграции.