System.InvalidOperationException: Службы для поставщиков баз данных «Microsoft.EntityFrameworkCore.SqlServer», «Microsoft.EntityFrameworkCore. InMemory» зарегистрированы у поставщика услуг. У поставщика услуг может быть зарегистрирован только один поставщик базы данных. Если возможно, убедитесь, что Entity Framework управляет своим поставщиком услуг, удалив вызов UseInternalServiceProvider. В противном случае рассмотрите возможность условной регистрации поставщика базы данных или поддержки одного поставщика услуг для каждого поставщика базы данных.
Это имеет смысл, поскольку REST API использует SQL Server, и я хотите использовать InMemory для модульных тестов.
Код: Выделить всё
public partial class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
var logger = LoggerFactory.Create(logging => logging.AddConsole()).CreateLogger
();
var isUnitTest = builder.Configuration.GetValue("IsUnitTest");
logger.LogInformation("IsUnitTest: {IsUnitTest}", isUnitTest);
if (isUnitTest)
{
builder.Services.AddDbContext(options => options.UseInMemoryDatabase("InMemoryDbForTesting"));
}
else
{
var conString = builder.Configuration.GetConnectionString("DatabaseConnection") ??
throw new InvalidOperationException("Connection string 'DatabaseConnection' not found.");
builder.Services.AddDbContext(options => options.UseSqlServer(conString));
}
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.MapOpenApi();
}
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
};
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.MapServiceEndpoints();
app.MapScanEndpoints();
app.MapPackageEndpoints();
app.MapImageEndpoints();
app.Run();
}
}
Код: Выделить всё
private WebApplicationFactory
? _factory;
private HttpClient? _client;
[SetUp]
public void Setup()
{
_factory = new WebApplicationFactory()
.WithWebHostBuilder(builder =>
{
builder.ConfigureAppConfiguration((context, config) =>
{
var settings = new Dictionary
{
{ "IsUnitTest", "true" }
};
config.AddInMemoryCollection(settings);
});
builder.ConfigureServices(services =>
{
// Remove all DbContextOptions descriptors
var descriptors = services.Where(d => d.ServiceType == typeof(DbContextOptions)).ToList();
foreach (var descriptor in descriptors)
{
services.Remove(descriptor);
}
services.AddDbContext(options =>
{
options.UseInMemoryDatabase("InMemoryDbForTesting");
});
// Add logging
services.AddLogging(configure => configure.AddConsole());
});
});
_client = _factory.CreateClient();
}
Мой вопрос: почему он не получает конфигурацию, которую я ему передаю?
Вот мой код:
Код: Выделить всё
var isUnitTest = builder.Configuration.GetValue("IsUnitTest");
Код: Выделить всё
isUnitTestЯ пытался добавить код для удаления дескриптора SQL Server из служб при запуске настройки модульного теста, но он все равно остается. p>
Что можно сделать, чтобы SQL Server добавлялся только условно при запуске приложения API в классе Program?
Подробнее здесь: https://stackoverflow.com/questions/793 ... pplication
Мобильная версия