Xunit测试上下文每个类只运行一次

时间:2016-03-23 12:18:34

标签: c# unit-testing xunit

我的测试类继承自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看起来更像是一个通用的设置。有没有人有类似我可以遵循的模式?

1 个答案:

答案 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成员。