Я использую xUnit для интеграционного тестирования. и для этого я использую для этого экземпляр localdb. С учетом сказанного, я хотел бы один раз запустить экземпляр БД с некоторыми предопределенными данными, и, конечно же, я бы оставил это верным для всех тестовых случаев. Я мог бы написать каждый тестовый пример изолированным, чтобы они не пересекались друг с другом, однако я хотел бы создать экземпляр БД только один раз.
Я выполнил конструктор xunit запускается перед каждым тестом и код выглядит например,
//similar to base class
public class DatabaseFixture : IDisposable
{
public SqlConnection Db { get; private set; }
public DatabaseFixture()
{
InitialDB();
}
public InitialDB()
{
CreateDBInstance();
CreateDBSchemas();
InitDBMetaData();
}
public void Dispose()
{
// clean up test data from the database
CleanUpDB();
}
}
//Class where you want to use shared class instance
public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
DatabaseFixture dbFixture;
public MyDatabaseTests(DatabaseFixture fixture)
{
this.dbFixture = fixture;
}
// write tests, using dbFixture.Db to get access to the SQL Server
}
Проблема, с которой я столкнулся, заключается в том, что я заметил, что этот DBFixture вызывается каждый раз для каждого тестового примера. Я думал, что с iClassFixture он вызывается только один раз. что вызывает проблему, когда тестовые примеры выполняются параллельно, потому что он пытается очистить db, в то время как другой тест пытается получить к нему доступ, а также несколько тестовых примеров будут пытаться создать db одновременно, что вызывает ошибку. https://xunit.net/docs/shared-context.html
Может кто-нибудь пролить свет на то, почему он не работает?