Xunit多个IClassFixtures

vam*_*one 5 c# testing unit-testing xunit

我的问题是如何在一个测试类中设置多个灯具?

但Zoo类的构造函数无法处理多个fixture.

举个例子:

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 );
   }
} 
Run Code Online (Sandbox Code Playgroud)

老虎班

public class Tiger : FixtureBase
{
   public Tiger()
   {
    this.BonesCount  = 4;
   }
}
Run Code Online (Sandbox Code Playgroud)

鸟类

public class Bird: FixtureBase
{
   public Bird()
   {
    this.BonesCount  = 2;
   }
}
Run Code Online (Sandbox Code Playgroud)

测试夹具基类

public class FixtureBase : IFixture
{
   public int BonesCount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和界面

public interface IFixture
{
   int BonesCount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

mwi*_*ski 9

首先,让我们回想一下当我们想在xUnit中使用Class Fixtures时:

何时使用:当您想要创建单个测试上下文并在类中的所有测试之间共享它时,并在类中的所有测试完成后将其清理干净.

正如您所说,您希望重用从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;
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管如此,我还没有真正了解您希望每次测试都能通过,因为您BonesCount在通用测试中硬编码为2.