Интеграционный тест с 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#).
Окончательный поток будет выглядеть так:
- Настройте TestServer для работы и размещения вашего проекта API AspNetCore (это может включать настройку баз данных или другой инфраструктуры, которая вам понадобится для тестов).
- Получить HttpClient из WebApplicationFactory
- Создайте интеграционные тесты, используя этот запрос HttpClient и POST (или используйте более конкретные клиенты GraphQL), и используйте конечные точки API с правильными URI.
Надеюсь, это поможет.