Xunitクラスのフィクスチャを使用できます。クラスフィクスチャを使用する場合、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 Documentation here。
希望します。あなたは以下のように他の二つの備品をカプセル化するクラスを作成し、DB器具前に実行するスタートアップ・フィクスチャを作成することができ、複数の備品について
編集10分の28 :
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");
}
}
派生クラスのインスタンスを作成するときは、ベースクラスのコンストラクタを呼び出す必要があります。これでXUnitは違うわけではありません。ただし、セットアップメソッド以外のコンストラクタを使用しないでください。 – HimBromBeere
これは、各テストケースが新しい初期化されたオブジェクトから始まる通常の方法です。実行するケースのクロノロジーを知らないので、連続して実行してテスト中のクラスを操作する必要があるテストを作成すべきではありません。いくつかのケースが他のものを持っている場合は、testcasemethodでこれを再作成/指定してください。 – LenglBoy
XUnitはデフォルトで並列にテストを実行します。テスト間で状態/値を共有すると、奇妙な動作につながる可能性があります。理由のないテストが失敗します。 – Fabio