Только условно добавляйте DbContext в приложение REST API.C#

Место общения программистов C#
Ответить
Anonymous
 Только условно добавляйте DbContext в приложение REST API.

Сообщение Anonymous »

Я создаю веб-API ASP.NET Core на C#, но когда я пытаюсь настроить макет веб-приложения в своем тестовом проекте NUnit, я сталкиваюсь с проблемой. При запуске теста я получаю следующее сообщение:

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();
}
Я создал условие в классе Program, чтобы он не добавлял SQL Server при запуске модульных тестов, но значение конфигурации возвращается как нулевое.
Мой вопрос: почему он не получает конфигурацию, которую я ему передаю?
Вот мой код:

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

var isUnitTest = builder.Configuration.GetValue("IsUnitTest");

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

isUnitTest
имеет значение null при запуске модульного теста.
Я пытался добавить код для удаления дескриптора SQL Server из служб при запуске настройки модульного теста, но он все равно остается. p>
Что можно сделать, чтобы SQL Server добавлялся только условно при запуске приложения API в классе Program?

Подробнее здесь: https://stackoverflow.com/questions/793 ... pplication
Ответить

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

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

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

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

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