Я пытаюсь написать модульное тестирование довольно простого веб-сервиса на основе ядра ASP.Net. Для сохранения я использую ядро Entity Framework для доступа к базе данных SQL.
В модульных тестах мне явно не нужна база данных, которая могла бы перетекать из одного теста в другой. После некоторых поисков я нашел эту статью https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/in-memory. Мой тестовый код теперь выглядит примерно так:
[Fact]
public void Test_method()
{
var options = new DbContextOptionsBuilder<ServiceContext>()
.UseInMemoryDatabase(databaseName: "Test_method") // Unique name for each test
.Options;
using (var context = new ServiceContext(options))
{
// Add test data
context.Dataset.Add(new ...);
context.SaveChanges();
}
using (var context = new ServiceContext(options))
{
// Perform tests
var controller = new Controller(new Service(context));
...
}
}
Это почти работает, каждый тестовый пример начинается с пустой БД. Но идентификаторы, которые присваиваются элементам testdata, не сбрасываются. Поэтому, если у меня есть один тест, который добавляет один элемент в свою БД, и другой тест, который добавляет два, тестовый элемент в первом тесте может получить идентификатор 1 или 3, в зависимости от порядка выполнения этих двух тестов.
Есть ли способ убедиться, что идентификаторы всегда начинаются с 1 в одном методе тестирования? Тестирование кода, который выполняет поиск на основе идентификаторов, действительно довольно уродливо, когда идентификаторы зависят от того, выполнялись ли другие тесты до текущего.