Сконфигурируйте AspNetCore TestServer, чтобы он возвращал 500 вместо выдачи исключения - PullRequest
0 голосов
/ 28 ноября 2018

Я разрабатываю веб-API, который в некоторых случаях отвечает 500 (уродливый дизайн, я знаю, но ничего не могу с этим поделать).В тестах есть ApiFixture, которая содержит AspNetCore.TestHost:

public class ApiFixture
{
    public TestServer ApiServer { get; }
    public HttpClient HttpClient { get; }

    public ApiFixture()
    {
        var config = new ConfigurationBuilder()
            .AddEnvironmentVariables()
            .Build();

        var path = Assembly.GetAssembly(typeof(ApiFixture)).Location;
        var hostBuilder = new WebHostBuilder()
            .UseContentRoot(Path.GetDirectoryName(path))
            .UseConfiguration(config)
            .UseStartup<Startup>();

        ApiServer = new TestServer(hostBuilder);
        HttpClient = ApiServer.CreateClient();
    }
}

Когда я вызываю конечную точку API с HttpClient из этого устройства, она должна ответить 500, вместо этого я получаю исключение, которое вызывается в тестируемом контроллере,Я знаю, что в тестах это может быть хорошей функцией, но я не хочу этого - я хочу проверить реальное поведение контроллера, который возвращает внутреннюю ошибку сервера.Есть ли способ перенастроить TestServer для возврата ответа?

Код в действии контроллера не имеет значения, может быть throw new Exception();

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете создать промежуточное программное обеспечение для обработки исключений и использовать его в тестах или, что лучше, всегда

public class ExceptionMiddleware
{
    private readonly RequestDelegate next;

    public ExceptionMiddleware(RequestDelegate next)
    {
        this.next = next;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        try
        {
            await this.next(httpContext);
        }
        catch (Exception ex)
        {
            httpContext.Response.ContentType = MediaTypeNames.Text.Plain;
            httpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
            await httpContext.Response.WriteAsync("Internal server error!");
        }
    }
}

Теперь вы можете зарегистрировать это промежуточное программное обеспечение в файле Startup.cs:

...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseMiddleware<ExceptionMiddleware>();
    ...
    app.UseMvc();
}

И есливы не хотите использовать его все время, вы можете создать TestStartup - дочерний класс вашего Startup и переопределить Configure метод для вызова UseMiddleware только там.Тогда вам нужно будет использовать новый класс TestStartup только в тестах.

...