Конструктор xUnit IClassFixture вызывается несколько раз - PullRequest
0 голосов
/ 05 мая 2020

Я использую 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

Может кто-нибудь пролить свет на то, почему он не работает?

...