Я провожу интеграционное тестирование API .NET, который подключается к MongoDB с использованием значений строки подключения и имени базы данных, хранящихся в файле app.settings.json. Для проведения тестов я использую xUnit и тестовые контейнеры. Когда тесты выполняются, переменная среды изменяется и предлагает моему Program.cs подключиться к тестовой базе данных. Изначально я хотел очистить и повторно заполнить эту тестовую базу данных между каждым тестом или выполнить какой-то откат, но не смог найти простой способ сделать это.
Сейчас я пытаюсь создать локальный макет тестовой базы данных, однако когда я создаю API и подключаюсь к нему в тестах, он по-прежнему указывает на действующую тестовую базу данных, а не на локальную. Я хочу иметь возможность изменить строку подключения в файле app.settings.json на строку подключения, которая генерируется в тестовом приспособлении каждый раз при запуске теста, но я не знаю, как это сделать. Я рассматривал возможность создания пользовательской WebFactory и внедрения зависимостей, но не знаю, как реализовать это с помощью имеющегося у меня кода.
Мой файл Program.cs выглядит так
public partial class Program
{
static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
bool isTestEnvironment = Helper.IsTestEnvironment();
builder.Services.Configure(
builder.Configuration.GetSection(isTestEnvironment ? "ArtsieTestDatabase" : "ArtsieDatabase"));
builder.Services.AddSingleton();
builder.Services.AddControllers()
.AddJsonOptions(
options => options.JsonSerializerOptions.PropertyNamingPolicy = null);
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Art API", Description = "Browse some beautiful art", Version = "v1" });
});
var app = builder.Build();
app.UseHttpsRedirection();
app.MapControllers();
//... rest of swagger documentation and endpoints
app.Run();
}
}
Мой тестовый файл выглядит так:
namespace art_api.Tests;
using ArtsieApi.Models;
using Microsoft.AspNetCore.Mvc.Testing;
using Newtonsoft.Json;
using System.Net;
using System.Text;
using MongoDB.Driver;
using Testcontainers.MongoDb;
using Xunit;
public class DatabaseFixture : IDisposable
{
private readonly IMongoDatabase _database;
private readonly MongoDbContainer _container;
public DatabaseFixture()
{
Environment.SetEnvironmentVariable("TEST_ENVIRONMENT", "true");
_container = new MongoDbBuilder().Build();
_container.StartAsync().Wait();
var connectionString = _container.GetConnectionString();
var client = new MongoClient(connectionString);
_database = client.GetDatabase("artsie-test");
// Seed initial data
SeedTestData();
}
private void SeedTestData()
{
var artCollection = _database.GetCollection("art");
var commentsCollection = _database.GetCollection("comments");
var usersCollection = _database.GetCollection("users");
}
public void Dispose()
{
_database.DropCollection("art");
_database.DropCollection("comments");
_database.DropCollection("users");
_container.DisposeAsync().GetAwaiter().GetResult();
Environment.SetEnvironmentVariable("TEST_ENVIRONMENT", null);
}
}
public class Endpoints : IClassFixture
{
private readonly DatabaseFixture _fixture;
public Endpoints(DatabaseFixture fixture)
{
_fixture = fixture;
}
[Fact(DisplayName = "200: GET /")]
public async Task TestRootEndpoint()
{
await using var application = new WebApplicationFactory();
using var client = application.CreateClient();
var response = await client.GetAsync("/");
var content = await response.Content.ReadAsStringAsync();
Assert.Equal("Hello World!", content);
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
//... rest of tests
}
Подробнее здесь: https://stackoverflow.com/questions/783 ... ng-integra
Как изменить строку подключения WebApplicationFactory во время интеграционного тестирования? ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение