2017-10-25 10 views
0

テストクラスのコンストラクタは、各テストが実行される前に開始され、現在の実行テストではアクセスできない基本クラスの初期化が行われる前に、ベースクラスを1回だけ作成します。これは可能ですか?xunitコンストラクタは各テストの前に実行されます

[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"); 
     ... 
    } 

ありがとうございます。

+1

派生クラスのインスタンスを作成するときは、ベースクラスのコンストラクタを呼び出す必要があります。これでXUnitは違うわけではありません。ただし、セットアップメソッド以外のコンストラクタを使用しないでください。 – HimBromBeere

+1

これは、各テストケースが新しい初期化されたオブジェクトから始まる通常の方法です。実行するケースのクロノロジーを知らないので、連続して実行してテスト中のクラスを操作する必要があるテストを作成すべきではありません。いくつかのケースが他のものを持っている場合は、testcasemethodでこれを再作成/指定してください。 – LenglBoy

+0

XUnitはデフォルトで並列にテストを実行します。テスト間で状態/値を共有すると、奇妙な動作につながる可能性があります。理由のないテストが失敗します。 – Fabio

答えて

1

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"); 
    } 
} 
+0

Fixtureを使用しました。コードでStartUpFixtureが表示されていますが、それは複数のフィクスチャを持つことができますか?それらを順番に実行しますか?最初のスタートアップの後にDbFixture – mojtaba357

+0

@ mojtaba357上記の更新された答えを確認してください – Shah

関連する問題