2016-03-23 136 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

相關問題