У меня два вопроса, но позвольте мне начать с самого начала. У меня ASP. NET Core 3.1 WebAPI, и я ищу наиболее оптимальный способ сквозного тестирования моих контроллеров ( Я не хочу использовать InMemory
provider ) , Я разделил свои тесты на два набора: «Только чтение» (GET
) и «Чтение-запись» (POST
, PUT
, PATCH
, DELETE
). Для тестов только для чтения я хочу создать совершенно новую базу данных (я использую миграцию вначале кода) один раз, а затем проверяю все GET
запросы один за другим. Для запросов на чтение и запись я хочу создать новую базу данных и удалить ее после теста.
Это то, что я сделал до сих пор:
public class TestFixture<TStartup> : IDisposable where TStartup : class
{
private readonly TestServer _server;
public TestFixture()
{
var builder = new WebHostBuilder().UseStartup<TStartup>();
builder.ConfigureAppConfiguration((context, conf) =>
{
conf.AddUserSecrets(typeof(Startup).GetTypeInfo().Assembly);
});
_server = new TestServer(builder);
Client = _server.CreateClient();
Client.BaseAddress = new Uri("http://localhost:5000");
}
public HttpClient Client { get; }
public void Dispose()
{
Client.Dispose();
_server.Dispose();
}
}
... и тест :
public class TestControllerShould : IClassFixture<TestFixture<Startup>>
{
public HttpClient Client { get; }
public TestControllerShould(TestFixture<Startup> fixture)
{
Client = fixture.Client;
}
[Fact]
public async Task GetHelloWorld()
{
// Arrange
var request = new HttpRequestMessage(new HttpMethod("GET"), "/test/");
// Act
var response = await Client.SendAsync(request);
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
var content = await response.Content.ReadAsStringAsync();
Assert.Equal("Hello World!", content);
}
}
У меня две проблемы. Прежде всего, я использую Startup
из основного проекта (что желательно, потому что я хочу его протестировать) со строкой производственного соединения, так что это одна проблема. Вторая проблема, я хотел бы создавать и удалять базу данных после каждого теста «записи», чего я не могу по понятным причинам. Итак, мои вопросы:
- Как я могу использовать
Startup
класс, но изменить только имя базы данных на "MyDatabaseName + Guid.NewGuid()"
? - Второй вопрос, как я могу создать и удалить базу данных (с уникальным именем) до и после каждого теста?
PS. Я не хочу использовать InMemory
провайдера. Я также не хочу использовать транзакцию и откат в конце теста. Я хочу сделать реальный интеграционный тест.