Как изменить строку подключения WebApplicationFactory во время интеграционного тестирования?C#

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

Сообщение Anonymous »

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

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

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

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

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

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

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