2016-03-30 22 views
1

私の質問は、1つのテストクラスで複数のフィクスチャを設定する方法ですか?Xunit multiple IClassFixtures

しかし、Zooクラスのコンストラクタは複数のフィクスチャを処理できません。

public class Zoo : IClassFixture<Tiger>, IClassFixture<Wolf>, IClassFixure<Bird> 
{ 
    private IFixture fixture; 
    public Zoo(IFixture fixture) 
    { 
    this.fixture = fixture; 
    } 

    [Fact] 
    public void TestAnimal() 
    { 
    //Arrange 
    int actualBonesCount = this.fixture.BonesCount; 
    int expectedBonesCount = 2; 

    //Act & Assert 
    Assert.Equal(expectedBonesCount, actualBonesCount); 
    } 
} 

トラクラス

public class Tiger : FixtureBase 
{ 
    public Tiger() 
    { 
    this.BonesCount = 4; 
    } 
} 

鳥クラス

public class Bird: FixtureBase 
{ 
    public Bird() 
    { 
    this.BonesCount = 2; 
    } 
} 

テストフィクスチャベースクラス

public class FixtureBase : IFixture 
{ 
    public int BonesCount { get; set; } 
} 
:exempleについて

すべての

およびインターフェイス

public interface IFixture 
{ 
    int BonesCount { get; set; } 
} 

答えて

7

まず、我々はxUnitフレームにクラス備品を使用する場合の、呼び出してみましょう:

使用するとき:を使用すると、単一のテストコンテキストを作成したいときそれをクラス内のすべてのテストで共有し、クラス内のすべてのテストが終了したらクリーンアップします。

あなたが言ったように、Zooテストクラスから実装テストへのメソッドを再利用したいと思います。実装は継承を使用するので、なぜテストクラスの継承も使用しないのですか?

public abstract class Zoo 
{ 
    protected IFixture Fixture; 

    [Fact] 
    public void TestAnimal() 
    { 
     //Arrange 
     int actualBonesCount = Fixture.BonesCount; 
     int expectedBonesCount = 2; 

     //Act & Assert 
     Assert.Equal(expectedBonesCount, actualBonesCount); 
    } 
} 

public class BirdTests : Zoo, IClassFixture<Bird> 
{ 
    public BirdTests(Bird fixture) 
    { 
     Fixture = fixture; 
    } 
} 

public class TigerTests : Zoo, IClassFixture<Tiger> 
{ 
    public BirdTests(Tiger fixture) 
    { 
     Fixture = fixture; 
    } 
} 

それでも、私は本当にあなたが一般的なテストで2にBonesCountをハードコードてきたように渡すために、各テストのために希望の方法を得ることはありません。

+0

戦車!これは実際に私が探しているテストシナリオではありません。私はそれが多くのテストデータを持つMemberDataのように見えますが、多くのテストメソッドを持つIClassFixtureとしていくつかの機能を持っています。 – vamone

+0

あなたの要件を理解していると100%確信していません。任意の説明とシナリオを使って例を更新することができますか?ありがとう! – mwilczynski

+0

もう一度、例として、内部にテストメソッドを含むテストクラスを作成しました。 'パブリッククラスZooTest { [ファクト] 公共ボイドTestEyesCount() { } [ファクト] 公共ボイドTestSkinQuality() { } }'、我々はいくつかとタイガーのような2つのクラスがあり、スパイダーこの動物に関する情報(蜘蛛のような32眼と虎だけ2)そして私の質問は、この2つのテストケースの間で目の数(および多く)が変わったのと同じZooTestクラスを使用してTigerとBirdをテストする方法です。そして、クラスタイガー、バードは一度初期化し、テストで行く必要があります – vamone

0

これはあなたのコメントの後に来た解決策です。どうもありがとうございました!

public static IEnumerable<object[]> TestCases = 
new TheoryData<Animal>{ new Bird { Eyes = 2 } }; 

[Theory] 
[MemberData(nameof(TestCases))] 
public void TestEyes(Animal email) 
{ 
//Arrange & Act & Assert 
} 

;)あなたの答えのための