Создание неаутентифицированного запроса в интеграционных тестах в .NET Core 3.0 - PullRequest
1 голос
/ 24 октября 2019

Было опубликовано хорошее решение для .NET Core 2.2 https://stackoverflow.com/a/50247041

protected override void ConfigureWebHost(IWebHostBuilder builder)
{
    builder.ConfigureTestServices(services =>
    {
        services
            .AddMvc(opts => opts.Filters.Add(new AllowAnonymousFilter()));
    });
}

Видимо, оно перестало работать в .NET Core 3.0

Сообщение об ошибке: Ожидаемый ответ.StatusCode должен быть в порядке, но обнаружен неавторизованным. Трассировка стека: в FluentAssertions.Execution.LateBoundTestFramework.Throw (Строковое сообщение) в FluentAssertions.Execution.TestFrameworkProvider.Throw (Строковое сообщение) в FluentAssertions.Execution.DefaultAssertionStrategy.HandleAsail. 1 failReasonFunc) в FluentAssertions.Execution.AssertionScope.FailWith (Func'1 failReasonFunc) в FluentAssertions.Execution.AssertionScope.FailWith (String message, Object [] args) в FluentAssertions.Primitives.ObjectAssertions.Be (объект ожидается, String,[] Потому что Аргс)

Кто-нибудь знает, существует ли подобный обходной путь для нового .NET Core?

1 Ответ

0 голосов
/ 07 ноября 2019

Я использовал тот же метод в .NET Core 2.2. То, что я наконец нашел, что работало для .NET Core 3.0, основано на Интеграционных тестах - Mock Authentication Я добавил обработчик проверки подлинности Mock Test следующим образом:

public class TestAuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
    public TestAuthHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock)
        : base(options, logger, encoder, clock)
    {
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        var claims = new[] { new Claim(ClaimTypes.Name, "Test user") };
        var identity = new ClaimsIdentity(claims, "Test");
        var principal = new ClaimsPrincipal(identity);
        var ticket = new AuthenticationTicket(principal, "Test");

        AuthenticateResult result = AuthenticateResult.Success(ticket);

        return Task.FromResult(result);
    }
}

Затем в ConfigureTestServices я изменил логику с

services.AddControllers(options =>
    {
        options.Filters.Add(new AllowAnonymousFilter());
    });

, чтобы добавить аутентификацию и переопределить политику авторизации как таковую:

services
    .AddAuthentication("Test")
    .AddScheme<AuthenticationSchemeOptions, TestAuthHandler>("Test", options => { });
services.AddAuthorization(options =>
{
    options.AddPolicy("<Existing Policy Name>", builder =>
    {
        builder.AuthenticationSchemes.Add("Test");
        builder.RequireAuthenticatedUser();
    });
    options.DefaultPolicy = options.GetPolicy("<Existing Policy Name>");
});

Теперь это позволило моим тестам работать в .NET Core 3.0.

...