2016-03-23 86 views
1

我有我的测试类是从一个基地,这基本上调用事实前一个Context方法继承只运行一次,但xUnit的是每个事实一次调用背景:的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继承正在提供带有与(SUT)类型一起覆盖的Because()和Context()方法的测试。我也认为IClassFixture过于通用,我的上下文对于每个测试标准都非常具体,SetFixture看起来更像是一个通用设置。有人有类似的模式,我可以遵循吗?

回答

0

xunit按实际情况从您的测试类实例化一个新对象。这样做是为了让每个测试都有自己的环境,并且使并行性更容易。在同一测试等级中测试之间共享上下文的推荐方式是接口IClassFixture<T>

如果您需要在测试中访问它,您可以将Because()方法添加到您的夹具类中。它看起来像你已经做了类似的事情,只有你做了继承而不是作曲。从链接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通过构造函数注入夹具类,所以你可以做的东西,你现在做他们的方式,你可以在接口是如何工作在这里读了你可以通过注入的参数而不是通过你的超类来访问灯具成员。

+0

此实现建议我需要一个新的Fixture类,以便为每个测试编写一个特定的场景,我正在寻找一些不太通用的东西 – Grace

+0

我很困惑,你没有除非需要创建一个新的类,如果需要的话,你目前的方法如何避免它?你的意思是不那么通用? – kai

+0

另外,我想到的越多,为什么要将每个测试的“设置”代码移动到夹具类中?这听起来像是如果每个场景都隐藏在另一个类中,它会严重影响你的测试的可读性。你应该保持小而专注的测试。 – kai

相关问题