Я настраиваю свою тестовую среду для использования базы данных в памяти для различных сценариев. Каждый тест использует «уникальную» базу данных, и каждый шаг теста использует свой контекст для структуры сущностей.
Проблема в том, что даже если в тестах используются разные базы данных «в памяти» и контексты, отличные от структуры сущностей, похоже, что идентичность в базе данных увеличивается.
Например, у меня есть 2 модульных теста:
[Test]
public async Task CanGetAllFromRepository()
{
var options = new DbContextOptionsBuilder<MyContext>()
.UseInMemoryDatabase(databaseName: "CanGetAllFromRepository").Options;
var testa = new User();
var testb = new User();
var testc = new User();
using (var context = new MyContext(options))
{
await context.Users.AddAsync(testa);
await context.Users.AddAsync(testb);
await context.Users.AddAsync(testc);
await context.SaveChangesAsync();
}
using (var context = new MyContext(options))
{
var repo = new UserRepository(context);
var all = await repo.GetAllAsync();
Assert.IsTrue(all.Count == 3);
}
}
[Test]
public async Task CanGetByIdFromRepository()
{
var options = new DbContextOptionsBuilder<MyContext>()
.UseInMemoryDatabase(databaseName: "CanGetByIdFromRepository").Options;
var testa = new User();
var testb = new User();
var testc = new User();
using (var context = new SalesPortalContext(options))
{
await context.User.AddAsync(testa);
await context.User.AddAsync(testb);
await context.User.AddAsync(testc);
await context.SaveChangesAsync();
}
using (var context = new MyContext(options))
{
var repo = new UserRepository(context);
var usera = await repo.GetByIdAsync(1);
var userb = await repo.GetByIdAsync(2);
var userc = await repo.GetByIdAsync(3);
Assert.IsNotNull(usera);
Assert.IsNotNull(userb);
Assert.IsNotNull(userc);
}
}
Если я запускаю тесты 1 на 1, это не проблема, но их все вместе; затем для 2-го модульного теста идентификаторы набора идентификаторов пользователей начинают с 4, 5, 6. (При индивидуальном запуске его 1, 2, 3, как и ожидалось).
UPDATE
Мне удалось обойти проблему, вручную назначив Пользователям их идентификаторы, например:
var testa = new User() { Id = 1 };
var testb = new User() { Id = 2 };
var testc = new User() { Id = 3 };