我的测试类继承自base,它基本上在Facts之前调用Context方法,但是xunit每个事实都调用一次上下文:
public class running_some_test : TestContext<ThingImTesting>
public void Because()
[Fact]
public void it_should_do_something()
[Fact]
public void it_should_do_more()
public void Context()
我知道我可以使用IClassFixture,但TestContext继承提供了使用Since()和Context()方法的测试以及SUT的类型。我也认为IClassFixture太通用了,我的上下文对每个测试标准都非常具体,而SetFixture看起来更像是一个通用的设置。有没有人有类似我可以遵循的模式?
答案 0 :(得分:0)
xunit每个事实从您的测试类中实例化一个新对象。这样做是为了给每个测试提供自己的环境并使并行性更容易。在同一测试类中测试之间共享上下文的推荐方法是IClassFixture<T>
接口。
如果您需要在测试中访问它,可以将Because()
方法添加到fixture类中。在我看来,你已经在做类似的事了,只有你用继承而不是组合来做。您可以在此处了解界面的工作原理:https://xunit.github.io/docs/shared-context.html#class-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; }
}
public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
DatabaseFixture fixture;
public MyDatabaseTests(DatabaseFixture fixture)
{
this.fixture = fixture;
}
// ... write tests, using fixture.Db to get access to the SQL Server ...
}
xunit通过你的构造函数注入fixture类,所以你可以像现在这样做,只有你通过注入的参数而不是你的超类来访问fixture成员。