Как исправить 500 внутренних ошибок сервера для тестов интеграции POST с использованием TestServer и Antiforgery? ASP.NET Core - PullRequest
0 голосов
/ 23 января 2019

У меня есть работающая реализация ASP.NET Core 2.2, в которой используются контроллеры MVC и API, и я собираю проект интеграционного тестирования, чтобы охватить все, что уже было проверено вручную - в основном базовый вариант.Все работает, кроме тестов, которые используют PostAsync для POST-данных.Эти тесты всегда получают 500 внутренних ошибок сервера в ответ от клиента, и я не могу понять, почему.Ой!

Настройка TestServer - довольно стандартный подход, который я видел во многих блогах и статьях.Класс TestStartup расширяет стандартный запуск и переопределяет конфигурацию для использования базы данных в памяти с начальными данными.Затем моя база тестовых данных использует TestStartup для создания сервера и клиента, и у меня есть метод, который, как я знаю, работает отлично, для извлечения токена защиты от подделки и добавления его в формы и заголовки.Все остальные тесты, проверяющие все другие аспекты CRUD, работают, доказывая, что заполненные данные могут быть извлечены как с помощью вызовов MVC, так и API.

Вызовы POST, которые в конечном итоге завершаются ошибкой с 500 Internal Server Error, превращают его вконтроллер и последующее хранилище, просто отлично.Со всеми этими аспектами я еще не смог увидеть источник 500.

    [Fact]
    public async void CreatePost_ShouldReturnViewWithNewlyCreatedLabelData()
    {
        // Arrange
        var formData = await EnsureAntiForgeryTokenOnForm(new Dictionary<string, string>()
        {
            { "Name", TestDataGraph.Labels.LabelNew.Name },
            { "WebsiteUrl", TestDataGraph.Labels.LabelNew.WebsiteUrl }
        });

        // Act
        var response = await Client.PostAsync("/labels/create", new FormUrlEncodedContent(formData));

        // Assert
        Assert.Equal(HttpStatusCode.Found, response.StatusCode);
        Assert.Equal("/Labels", response.Headers.Location.ToString());
    }

Это простой пример теста в Xunit, который пытается проверить создание нового простого объектавведите Label, через маршрут MVC, который следует стандартному формату пути, будучи созданным в качестве основы.Этот тест превратит его в контроллер и его хранилище, но ответом будет Внутренняя ошибка сервера 500.

Мог ли я пропустить что-то важное при запуске?Любые идеи для получения дополнительной информации об этой неудаче?Заранее спасибо!Я могу опубликовать больше кода или подробностей, если они будут полезны.

1 Ответ

0 голосов
/ 13 июня 2019

Попробуйте добавить запись трассировки ... Запись трассировки будет отображать активность в .Net Core framework.

...
public static ILogger<ConsoleLoggerProvider> AppLogger = null;
public static ILoggerFactory loggerFactory = null;
//
public void ConfigureServices(IServiceCollection services)
{
    services.AddLogging(builder => builder
        .AddConsole()
        .AddFilter(level => level >= LogLevel.Trace)
    );
    loggerFactory = services.BuildServiceProvider().GetService<ILoggerFactory>();
    AppLogger = loggerFactory.CreateLogger<ConsoleLoggerProvider>();
    ...

Пример журнала трассировки:

trce: Microsoft.AspNetCore.Mvc.Razor.Internal.RazorViewCompiler[7]
    Could not find a file for view at path '/Views/Home/_Layout.cshtml'.

После устранения проблемы измените LogLevel на более подходящее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...