В настоящее время я реализую сбор / фикстуру базы данных для своих модульных тестов, как описано здесь по этому вопросу:
xUnit.net - запускать код один раз до и после ВСЕХ тестов
Однако вместо использования базы данных InMemory я использую SQLite, поскольку в настоящее время InMemory имеет ошибку в .Net Core 2.1, которая не выполняет проверку последовательности при использовании типа байтового массива
Это приводит меня к моему текущему затруднительному положению, а именно к тому, что массив байтов, когда вы настраиваете фикстуру базы данных, не проходит через модульный тест, когда контекст извлекается из фикстуры базы данных в модульный тест, что вызывает ошибки параллелизма. когда пытаюсь запустить тесты.
В качестве примера:
Сначала установите класс DatabaseFixture следующим образом:
public class DatabaseFixture : IDisposable
{
public DatabaseFixture()
{
var connectionStringbuilder = new SqliteConnectionStringBuilder{DataSource = ":memory:", Cache = SqliteCacheMode.Shared};
var connection = new SqliteConnection(connectionStringbuilder.ToString());
options = new DbContextOptionsBuilder<CRMContext>()
.UseSqlite(connection)
.EnableSensitiveDataLogging()
.Options;
using (var context = new CRMContext(options))
{
context.Database.OpenConnection();
context.Database.EnsureCreated();
context.Persons.AddRange(persons);
context.SaveChanges();
}
}
public DbContextOptions<CRMContext> options { get; set; }
public void Dispose()
{
using (var context = new CRMContext(options))
{
context.Database.CloseConnection();
context.Dispose();
}
}
private IQueryable<Person> persons = new List<Person>()
{
new Person
{
Id = 1,
Forename = "Test",
Surname = "User",
RowVersion = new byte[0]
},
new Person
{
Id = 2,
Forename = "Another",
Surname = "Test",
RowVersion = new byte[0]
}
}.AsQueryable();
}
Настройте пустой класс DatabaseCollection в соответствии с первая ссылка:
[CollectionDefinition("Database collection")]
public class DatabaseCollection : ICollectionFixture<DatabaseFixture>
{
}
Затем настройте свой модульный тест, чтобы использовать этот компонент базы данных:
[Collection("Database collection")]
public class PersonTests : BaseTests
{
private readonly DatabaseFixture _fixture;
public PersonTests(DatabaseFixture fixture)
{
_fixture = fixture;
}
[Fact]
public void SaveAndReturnEntityAsync_SaveNewPerson_ReturnsTrue()
{
{
using (var context = new Context(_fixture.options))
{
var existingperson = new Person
{
Id = 2,
Forename = "Edit",
Surname = "Test",
RowVersion = new byte[0]
};
var mapperConfig = new MapperConfiguration(cfg => { cfg.AddProfile(new InitializeAutomapperProfile()); });
var AlertAcknowledgeService = GenerateService(context);
//Act
//var result = _Person.SaveAndReturnEntityAsync(mappedPersonAlertAcknowledge);
//Assert
Assert.Equal("RanToCompletion", result.Status.ToString());
Assert.True(result.IsCompletedSuccessfully);
Assert.Equal("The data is saved successfully", result.Result.SuccessMessage);
}
}
Теперь, когда я отлаживаю это, он правильно попадает в прибор, и вы можете, когда вы расширяете представление результатов, переменная RowVersion назначается правильно:

Однако, когда данные передаются в модульный тест, версия строки получает значение null:

Любая помощь по этому вопросу будет принята с благодарностью!





Похоже, у вас может быть состояние гонки, поскольку вы вызываете асинхронный метод, не ожидая его, а затем утверждаете, что результат задачи завершен сразу после этого. (Не уверен, что это часть вашей проблемы). Я рекомендую сделать тест асинхронным и дождаться вызова результата.