Тест интеграции с WebApplicationFactory завершается неудачей с ObjectDisposeException для IServiceProviderC#

Место общения программистов C#
Anonymous
Тест интеграции с WebApplicationFactory завершается неудачей с ObjectDisposeException для IServiceProvider

Сообщение Anonymous »

У меня есть простой тест для проверки работоспособности, который выглядит следующим образом:

Код: Выделить всё

public class HealthCheckEndpointTests : IClassFixture
{
private readonly ItemsApplicationFactory _factory;

public HealthCheckEndpointTests(ItemsApplicationFactory factory)
{
_factory = factory;
}

public async Task HealthCheck_Test()
{
// Arrange
HttpClient httpClient = _factory.CreateClient();

// Act
string response = await httpClient.GetStringAsync("/health/live");

// Assert
Assert.Equal("Healthy", response);
}
}
Моя ItemsApplicationFactory выглядит следующим образом:

Код: Выделить всё

public class ItemsApplicationFactory : WebApplicationFactory
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureKestrel(options => options.AllowSynchronousIO = true);

builder.ConfigureServices(services =>
{
// remove db context options if exists
var dbContextDescriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions));
if (dbContextDescriptor != null)
services.Remove(dbContextDescriptor);

var serviceCollection = new ServiceCollection()
.AddEntityFrameworkInMemoryDatabase()
.BuildServiceProvider();

services.AddDbContext(mariaDb =>
{
mariaDb.UseInMemoryDatabase("template");
mariaDb.UseInternalServiceProvider(serviceCollection);
});
});
}
}
Когда я запускаю тест, я получаю следующее исключение

Код: Выделить всё

System.ObjectDisposedException : Cannot access a disposed object.
Object name: 'IServiceProvider'
Я изменил свой тест, чтобы проверить, вызвано ли исключение инициализацией ItemsApplicationFactory или HttpClient. Итак, тест выглядит так

Код: Выделить всё

public class HealthCheckEndpointTests : IClassFixture
{
private readonly ItemsApplicationFactory _factory;

public HealthCheckEndpointTests(ItemsApplicationFactory factory)
{
_factory = factory;
}

public async Task HealthCheck_Test()
{
// Arrange
HttpClient httpClient = _factory.CreateClient();

// Act
await Task.Run(() => Task.CompletedTask);

// Assert
Assert.True(true);
}
}
Тест не выдал никаких исключений.
Почему _factory.CreateClient(); не выдает исключение, но httpClient.GetStringAsync( "/health/live") имеет? И как это исправить?

Подробнее здесь: https://stackoverflow.com/questions/761 ... xception-f

Вернуться в «C#»