2016-03-30 61 views
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; } 
} 

而且接口

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

不過,我真的不明白怎麼會需要爲每個測試通過與您在一個通用的測試硬編碼BonesCount 2。

+0

坦克爲您解答!這並不是我正在尋找的測試場景。我希望它看起來像帶有許多測試數據的MemberData,但仍然具有一些功能作爲具有許多測試方法的IClassFixture。 – vamone

+0

如果我瞭解您的要求,我不是100%確定。任何機會,你可以用一些解釋和可能的場景更新你的例子?謝謝! – mwilczynski

+0

嗨,例如,我們有一個測試類,裏面有測試方法。 '公共類ZooTest { [事實] 公共無效TestEyesCount() { } [事實] 公共無效TestSkinQuality() { } }'和我們有2類,如虎,和蜘蛛與一些關於這些動物的信息。 (像蜘蛛有32隻眼睛,只有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 
} 

;)