Как использовать WebApplicationFactory с тестовыми контейнерами для тестов SpecFlow?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как использовать WebApplicationFactory с тестовыми контейнерами для тестов SpecFlow?

Сообщение Anonymous »

Я работаю над проектом .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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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