我一直在寻找相同的答案,这时xUnit文档在如何实现类夹具和集合夹具方面非常有帮助,这些夹具为开发人员在类或类组级别提供了广泛的设置/拆卸功能。这与盖尔·萨格伯格(Geir Sagberg)的回答是一致的,并且给出了良好的框架实现以说明其外观。
https://xunit.github.io/docs/shared-context.html
集合夹具何时使用:当您想要创建一个测试上下文并在多个测试类的测试之间共享它,并在测试类中的所有测试完成后将其清除。
有时您会想要在多个测试类之间共享一个夹具对象。用于类固定装置的数据库示例是一个很好的示例:您可能希望使用一组测试数据来初始化数据库,然后将该测试数据保留在适当的位置以供多个测试类使用。您可以使用xUnit.net的collection fixture功能在多个测试类中的测试之间共享一个对象实例。
要使用收集装置,您需要执行以下步骤:
创建夹具类,然后将启动代码放入夹具类构造函数中。如果夹具类需要执行清除,请在夹具类上实现IDisposable,然后将清除代码放入Dispose()方法中。创建集合定义类,并使用[CollectionDefinition]属性对其进行修饰,为其指定一个唯一名称,该名称将标识测试集合。将ICollectionFixture <>添加到集合定义类。使用您提供给测试集合定义类的[CollectionDefinition]属性的唯一名称,将[Collection]属性添加到将成为集合一部分的所有测试类中。如果测试类需要访问Fixture实例,请将其添加为构造函数参数,它将自动提供。这是一个简单的示例:
public class DatabaseFixture : IDisposable
{
public DatabaseFixture()
{
Db = new SqlConnection("MyConnectionString");
// ... initialize data in the test database ...
}
public void Dispose()
{
// ... clean up test data from the database ...
}
public SqlConnection Db { get; private set; }
}
[CollectionDefinition("Database collection")]
public class DatabaseCollection : ICollectionFixture<DatabaseFixture>
{
// This class has no code, and is never created. Its purpose is simply
// to be the place to apply [CollectionDefinition] and all the
// ICollectionFixture<> interfaces.
}
[Collection("Database collection")]
public class DatabaseTestClass1
{
DatabaseFixture fixture;
public DatabaseTestClass1(DatabaseFixture fixture)
{
this.fixture = fixture;
}
}
[Collection("Database collection")]
public class DatabaseTestClass2
{
// ...
}
xUnit.net处理集合固定装置的方式与类固定装置的方式几乎相同,不同的是集合固定装置对象的寿命更长:它是在集合中的任何测试类中运行任何测试之前创建的,并且不会被清除直到集合中的所有测试类均已运行完毕。
测试集合也可以用IClassFixture <>装饰。xUnit.net就像对待测试集中的每个单独测试类都用类夹具装饰一样。
测试集合还影响xUnit.net在并行运行测试时运行测试的方式。有关更多信息,请参见并行运行测试。
重要说明:夹具必须与使用夹具的测试位于同一组件中。