web-dev-qa-db-ja.com

xunitコンストラクターは各テストの前に実行されます

現在実行中のテストではアクセスできないベースクラスの各テストおよび以前の初期化の前に開始されるテストクラスコンストラクターで、ベースクラスを1回だけ作成したいと思います。これを行うことは可能ですか?

[Category("Basics")]
[Collection("DD")]
[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage]
public class SecurityTests : TestUnitBase
{
    StartUpFixture fixture;
    public AuthenticationTests(StartUpFixture fixture)
       : base()
    {
        this.fixture = fixture;
    }

    [Fact(DisplayName = "Successful response Test1")]
    public void SuccessfulResponseTest1()
    {
        var users = base.Db.Users.FirstOrDefault(x => x.Name == "...");
        ...
    }

    [Fact(DisplayName = "Successful response Test2")]
    public void SuccessfulResponseTest2()
    {
        var users = base.Db.Users.FirstOrDefault(x => x.Name == "iranian1");
        ...
    }

前もって感謝します。

15
M.Khooryani

Xunit Classフィクスチャを使用できます。クラスフィクスチャを使用する場合、xUnit.netは、テストの実行前にフィクスチャインスタンスが作成されるようにし、すべてのテストが終了すると、Dispose(存在する場合)を呼び出してフィクスチャオブジェクトをクリーンアップします。例えば:

//similar to base class
public class DatabaseFixture : IDisposable
{
    public SqlConnection Db { get; private set; }
    public DatabaseFixture()
    {
        Db = new SqlConnection("MyConnectionString");

        // initialize data in the test database
    }

    public void Dispose()
    {
        // clean up test data from the database
    }
}

//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
}

テストごとに、MyDatabaseTestsの新しいインスタンスを作成し、DatabaseFixtureの共有インスタンスをコンストラクターに渡します。

Xunitドキュメント こちら

それが役に立てば幸い。

28/10を編集複数のフィクスチャの場合、他の2つのフィクスチャを以下のようにカプセル化するクラスを作成し、dbフィクスチャの前に実行するスタートアップフィクスチャを作成できます。

public class SecurityTestsFixture : IDisposable
{
    public DatabaseFixture Dbfixture { get; private set; }
    public StartupTestFixture Startupfixture { get; private set; }

    public SecurityTestsFixture()
    {
        Startupfixture = new StartupTestFixture();
        Dbfixture = new DatabaseFixture(Startupfixture);
    }

    public void Dispose()
    {
        // clean up code
        Dbfixture.Dispose();
    }

    public class StartupTestFixture
    {
        public string SqlConnString { get; private set; }
        public StartupTestFixture()
        {
            SqlConnString = ConfigurationManager.AppSettings["SqlConnectionString"];

            // other startup code
        }
    }

    public class DatabaseFixture : IDisposable
    {
        public SqlConnection Db { get; private set; }
        public DatabaseFixture(StartupTestFixture sFixture)
        {
            Db = new SqlConnection(sFixture.SqlConnString);

            // initialize data in the test database
        }

        public void Dispose()
        {
            // clean up test data from the database
        }
    }
}

およびテストクラス:

public class Xunittests : IClassFixture<SecurityTestsFixture>
{
    SecurityTestsFixture _securityFixture;
    public Xunittests(SecurityTestsFixture securityfixture)
    {
        _securityFixture = securityfixture;
    }

    [Fact(DisplayName = "Successful response Test1")]
    public void SuccessfulResponseTest1()
    {
        var db = _securityFixture.Dbfixture.Db;
        //var users = db.Users.FirstOrDefault(x => x.Name == "...");
        Assert.Equal("test", "test");
    }
}
20
Shah