Интеграционный тест с Hotchocolate GraphQL и TestServer на C#

У меня есть ASP.NET Core Api (.NET 6.0) с конечными точками REST и GraphQL. Конечные точки GraphQL реализованы с помощью Hotchocolate (12.6.0).

Для тестирования конечных точек REST я создаю TestServer нравится:

      protected static async Task<TestServer> CreateServer()
{
     IHostBuilder webHostBuilder = new HostBuilder();
     webHostBuilder.UseContentRoot(Directory.GetCurrentDirectory());

     webHostBuilder.ConfigureWebHost(webBuilder =>
          {
               webBuilder
                    .UseTestServer()
                    .UseEnvironment("Test")
                    .ConfigureAppConfiguration((_, config) =>    
                         config.AddJsonFile("appsettings.Test.json"))
                    .UseStartup<AuthenticatedTestStartup>();
           });

     IHost host = await webHostBuilder.StartAsync();
     return host.GetTestServer();
}

AuthenticatedTestStartup происходит от Startupи переопределяет некоторые методы, например, конфигурацию базы данных. Используя тестовый сервер, созданный выше, я могу выполнять интеграционные тесты, используя .CreateClient() метод, который возвращает HttpClientобъект. С помощью этого клиента я могу вызывать конечные точки REST. Это работает очень хорошо.

Теперь мой вопрос: есть ли способ использовать этот тестовый сервер для интеграционных тестов с конечными точками GraphQL, и если да, то как? Если нет: каковы альтернативы программному тестированию конечных точек GraphQL в тестовой базе данных?

2 ответа

Поскольку GraphQL является сервером через HTTP, вы можете протестировать его так же, как обычную конечную точку REST.

Но если вам не нужен HTTP для ваших тестов, я бы порекомендовал использовать сервер в памяти, так как это намного быстрее.

      // arrange
var executor = await new ServiceCollection()
    .AddGraphQLServer()
    .AddQueryType<Query>()
    .BuildRequestExecutorAsync();

// act
var query = QueryRequestBuilder.New()
  .SetQuery("{ foo }")
  // you can also add a test principal if you want to test authorised
  // resolvers
  .AddProperty(nameof(ClaimsPrincipal), CreatePrincipal())
  .Create()
var result = executor.ExecuteAsync(query);

// assert
// assert here

Для проведения интеграционных тестов вы можете использовать «TestServer», предоставленный Microsoft.AspNetCore.TestHost.

Вот базовая документация по настройке:https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-7.0 .

Он работает так же хорошо со стандартными конечными точками REST, как и с сервером GraphQL. Я настроил его в соответствии с документацией, работаю с сервером HotChocolate 13, и все выглядит хорошо.

Однако не забывайте правильно выбирать и использовать URL/URI конечной точки GraphQl (по умолчанию будет что-то вроде «http://localhost/graphql», где «http://localhost» — это базовый URL-адрес, предоставленный TestServer, а «/graphql» — это значение по умолчанию для hotchocolate). если вы его не меняли, вам необходимо указать его как URI-маршрут для http-запросов.

Затем вы можете использовать WebApplicationFactory для получения HttpClient и использовать стандартные запросы POST с соответствующим телом для доступа к GraphQl API. Вероятно, вы также можете включить более надежные клиенты GraphQl для выполнения запросов (например, клиент StrawberryShake для C#).

Окончательный поток будет выглядеть так:

  1. Настройте TestServer для работы и размещения вашего проекта API AspNetCore (это может включать настройку баз данных или другой инфраструктуры, которая вам понадобится для тестов).
  2. Получить HttpClient из WebApplicationFactory
  3. Создайте интеграционные тесты, используя этот запрос HttpClient и POST (или используйте более конкретные клиенты GraphQL), и используйте конечные точки API с правильными URI.

Надеюсь, это поможет.

Другие вопросы по тегам