Xunit 多个 IClassFixtures

问题描述 投票:0回答:4

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

但是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; }
}
c# unit-testing testing xunit
4个回答
16
投票

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

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

正如您所说,您希望重用

Zoo
测试类中的方法来实现测试。既然实现使用继承,为什么测试类不也使用继承呢?

public abstract class Zoo
{
    protected readonly IFixture Fixture;

    protected Zoo(IFixture fixture)
    {
       Fixture = 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)
       : base(fixture)
    {
    }
}

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

不过,我真的不明白你希望每个测试如何通过,因为你在通用测试中将

BonesCount
硬编码为 2。


4
投票

这是我在您发表评论后得出的解决方案。非常感谢!

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

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

;)


0
投票

您可以使用收藏装置 在多个测试类之间使用共享上下文

何时使用:

当您想要创建单个测试上下文并在测试之间共享它时 在几个测试类中,并在所有之后将其清理干净 测试班的测试已经结束了。

public class ServerFixture : IDisposable
{
    public ServerFixture()
    { 
    } 
    public void Dispose()
    { 
    } 
}

[CollectionDefinition("Server collection")]
public class ServerCollection : ICollectionFixture<ServerFixture>
{
}

[Collection("Server collection")]
public class ServerTestScenarios_1
{
    ServerFixture fixture;

    public ServerTestScenarios_1(ServerFixture fixture)
    {
        this.fixture = fixture;
    }
}

[Collection("Server collection")]
public class ServerTestScenarios_2
{
    ServerFixture fixture;
    
    public ServerTestScenarios_2(ServerFixture fixture)
    {
        this.fixture = fixture;
    }
}

你可以看到: https://xunit.net/docs/shared-context#collection-fixture

希望有帮助


0
投票

你的班级声明没问题。您可以从多个类装置继承。但是,您需要将它们全部添加到构造函数中,并为每个属性创建单独的属性。

public class Zoo : IClassFixture<Tiger>, IClassFixture<Wolf>, IClassFixure<Bird>
{
   private Tiger tigerFixture;
   private Wolf wolfFixture;
   private Bird birdFixture;

   public Zoo(Tiger tiger, Wolf wolf, Bird bird) 
   { 
       tigerFixture = tiger;
       wolfFixture = wolf;
       birdFixture = bird;
   }

如果您想对每个固定装置运行相同的测试,则必须将其设为理论并传递一些参数来指示每次运行测试应使用哪个固定装置。

© www.soinside.com 2019 - 2024. All rights reserved.