Как написать тест контроллера при использовании аутентификации канала-носителя? - PullRequest
0 голосов
/ 24 марта 2020

Вот так выглядит мой контроллер:

    [Authorize(AuthenticationSchemes = "Bearer")]
    [ApiController]
    [Produces("application/json")]
    [Route("/api/account/{accountId}/service")]
    public class MyServiceController : ControllerBase
    {
        private readonly IMyService _service;

        public MyServiceController(IMyService service)
        {
            this._service = service;
        }
        [HttpGet]
        [ProducesResponseType(typeof(IEnumerable<SomeDto>), StatusCodes.Status200OK)]
        public async Task<IEnumerable<SomeDto>> GetAllServicesAsync([FromRoute] string accountId, CancellationToken cancellationToken)
        {
            return await this._application.GetServicesAsync(accountId, cancellationToken);
        }

и тест, который выглядит следующим образом:

        [Fact]
        public async Task GetAllAsyncTest()
        {
            var expected = new SomeDto { AccountId = "123" };

            this._mockApplication.Setup(service => service.GetSomesAsync(expected.AccountId, It.IsAny<CancellationToken>()))
                .ReturnsAsync(new List<SomeDto> { expected });
            var client = this._factory.MockService(this._mockApplication).CreateClient();
            var httpResponse = await client.GetAsync($"/api/account/{expected.AccountId}/account");
            httpResponse.EnsureSuccessStatusCode();
            var actual = await JsonSerializer.DeserializeAsync<IEnumerable<SomeDto>>(await httpResponse.Content.ReadAsStreamAsync());

            actual.Should().HaveCount(1).And.ContainEquivalentOf(expected);
        }

Я только что добавил [Authorize(AuthenticationSchemes = "Bearer")], и он прекрасно работает, когда я запускаю мой сервер. Проблема в том, что мой тест не проходит с этим:

System.Net.Http.HttpRequestException : Response status code does not indicate success: 401 (Unauthorized).
   at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode()

Если я удаляю обратно [Authorize(AuthenticationSchemes = "Bearer")], мои тестовые проходы на моих конечных точках не аутентифицируются.

Как я могу сделать этот тестовый проход ? Я пытался:

Все попытки не увенчались успехом. Либо тест пройден, либо проверка подлинности работает. Никогда оба. Как я могу пройти этот тест, сохраняя аутентификацию? Спасибо

1 Ответ

0 голосов
/ 30 марта 2020

Я изменил только свой тест, и он сработал.

        builder.ConfigureTestServices(services =>
            {
                {
                    services.Replace(new ServiceDescriptor(typeof(IPolicyEvaluator), typeof(DisableAuthenticationPolicyEvaluator), ServiceLifetime.Singleton));
                    services.AddScoped<IDbContextProvider, DbContextProvider>();
                });
            });

    public class DisableAuthenticationPolicyEvaluator : IPolicyEvaluator
    {
        public async Task<AuthenticateResult> AuthenticateAsync(AuthorizationPolicy policy, HttpContext context)
        {
            // Always pass authentication.
            var authenticationTicket = new AuthenticationTicket(new ClaimsPrincipal(), new AuthenticationProperties(), "Bearer");
            return await Task.FromResult(AuthenticateResult.Success(authenticationTicket));
        }

        public async Task<PolicyAuthorizationResult> AuthorizeAsync(AuthorizationPolicy policy, AuthenticateResult authenticationResult, HttpContext context, object resource)
        {
            // Always pass authorization
            return await Task.FromResult(PolicyAuthorizationResult.Success());
        }
    }
...