У меня есть минимальная настройка API .NET 8:
var builder = WebApplication.CreateBuilder(args);
var app = builder.ConfigureApp();
app.Run();
// Reference for Testing Purposes of FastEndpoints
namespace BeeHive.Api
{
public abstract class Program;
}
public static WebApplication ConfigureApp(this WebApplicationBuilder builder)
{
builder = builder
.ConfigureConfiguration()
.ConfigureLogging()
.ConfigureSwagger()
.ConfigureDatabase()
.ConfigureApi();
var app = builder.Build();
app.UseSwaggerConfig()
.UseApi()
.UseDatabase();
return app;
}
Теперь я использую FastEnpoinds:
https://fast-endpoints.com/docs/integration-unit-testing#service-registration
При этом у меня есть простая настройка моего интеграционного теста:
public class PingPongEndpointTest(BeeHiveApiFixture app) : TestBase<BeeHiveApiFixture>
{
[Fact]
public async Task PingPongEndpoint_ExpectedBehaviour()
{
var (httpResponse, dataResponse) = await app.Client.POSTAsync<PingPongEndpoint, PingPongEndpointRequest, PingPongEndpointResponse>(
new()
{
Text = "Test"
});
httpResponse.StatusCode.Should().Be(HttpStatusCode.OK);
dataResponse.ReversedText.Should().Be("tseT");
}
}
public class BeeHiveApiFixture : AppFixture<Program>
{
protected override void ConfigureApp(IWebHostBuilder a)
{
// Doesnt overwrite the WebApplicationBuilder
}
}
Теперь моя цель — использовать AddDbContext из моей базы данных ConfigurationDatabase, потому что это отображается в реальной базе данных, вместо этого я хочу перезаписать его базой данных InMemory.
Обычно в AppFixture я хотел бы перезаписать это поведение. Но при наличии IWebHostBuilder в переопределении FastEndpoints и WebApplicationBuilder в моей настройке это невозможно переопределить (оба вызываются).
Как это сделать?
вот как вы обычно заменяете контекст БД для тестов:
public class BeeHiveApiFixture : AppFixture<Program>
{
protected override void ConfigureServices(IServiceCollection services)
{
// remove the real db context configuration
var descriptor = services.SingleOrDefault(d => d.ServiceType == typeof(DbContextOptions<MyDbContext>));
if (descriptor != null)
services.Remove(descriptor);
//add a test db context
services.AddDbContext<MyDbContext>(o => o.UseInMemoryDatabase("TestDB"));
}
}
если это не так, предоставьте репродукционный проект через созданную вами проблему GitHub. будем более чем рады исправить это для вас.