Я работаю над проектом .NET, в котором хочу интегрировать WebApplicationFactory с Testcontainers, чтобы использовать PostgreSQL для своих тестов SpecFlow. Я столкнулся с некоторыми проблемами, гарантируя, что контейнер PostgreSQL будет запущен и готов до применения конфигурации приложения. Я хочу сначала спросить, возможно ли это вообще? Моя самая большая проблема — настройка и использование контекста, он не работает. Могу ли я внедрить любую службу, которую захочу, с помощью WebHostFactory? Вот что я пробовал до сих пор:
CustomWebApplicationFactory:
using DotNet.Testcontainers.Builders;
using DotNet.Testcontainers.Containers;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System.Linq;
using System.Threading.Tasks;
public class CustomWebApplicationFactory : WebApplicationFactory, IAsyncLifetime where TStartup : class
{
private readonly TestcontainerDatabase _postgresContainer;
public CustomWebApplicationFactory()
{
_postgresContainer = new TestcontainersBuilder
()
.WithDatabase(new PostgreSqlTestcontainerConfiguration
{
Database = "testdb",
Username = "postgres",
Password = "password"
})
.Build();
}
public async Task InitializeAsync()
{
await _postgresContainer.StartAsync();
}
public async Task DisposeAsync()
{
await _postgresContainer.StopAsync();
await _postgresContainer.DisposeAsync();
}
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
var descriptor = services.SingleOrDefault(
d => d.ServiceType == typeof(DbContextOptions));
if (descriptor != null)
{
services.Remove(descriptor);
}
services.AddDbContext(options =>
{
options.UseNpgsql(_postgresContainer.ConnectionString);
});
services.AddScoped();
var sp = services.BuildServiceProvider();
using (var scope = sp.CreateScope())
{
var scopedServices = scope.ServiceProvider;
var db = scopedServices.GetRequiredService();
db.Database.EnsureCreated();
}
});
}
public MyDbContext CreateDbContext()
{
var options = new DbContextOptionsBuilder()
.UseNpgsql(_postgresContainer.ConnectionString)
.Options;
return new MyDbContext(options);
}
public IServiceScope CreateScope()
{
return Services.CreateScope();
}
}
Перехватчики SpecFlow:
using Microsoft.AspNetCore.Mvc.Testing;
using Microsoft.Extensions.DependencyInjection;
using System.Net.Http;
using System.Threading.Tasks;
using TechTalk.SpecFlow;
[Binding]
public class SpecFlowHooks
{
private static CustomWebApplicationFactory _factory;
private static HttpClient _client;
private static MyDbContext _dbContext;
private static IServiceScope _scope;
[BeforeTestRun]
public static async Task BeforeTestRun()
{
_factory = new CustomWebApplicationFactory();
await _factory.InitializeAsync();
_client = _factory.CreateClient();
_dbContext = _factory.CreateDbContext();
_scope = _factory.CreateScope();
}
[AfterTestRun]
public static async Task AfterTestRun()
{
_client.Dispose();
_dbContext.Dispose();
_scope.Dispose();
await _factory.DisposeAsync();
}
public static HttpClient Client => _client;
public static MyDbContext DbContext => _dbContext;
public static IServiceScope Scope => _scope;
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... flow-tests
Как использовать WebApplicationFactory с тестовыми контейнерами для тестов SpecFlow? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Проблема в репозиториях Mongo с весенним загрузочным тестом junit5 и тестовыми контейнерами
Anonymous » » в форуме JAVA - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Написание модульных тестов: как программно получить папку с тестовыми файлами
Anonymous » » в форуме C# - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Крюки: Beforetestrun и Aftertestrun не работают при выполнении тестов Specflow
Anonymous » » в форуме C# - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-