2017-07-26 39 views
2

我目前有一組單元測試,它們對於一些Rest API端點是一致的。說這個類是這樣定義的。NUnit 3.x - 用於後代測試類的TestCaseSource

public abstract class GetAllRouteTests<TModel, TModule> 
{ 
    [Test] 
    public void HasModels_ReturnsPagedModel() 
    { 
    // Implemented test 
    } 
} 

有了實現的測試夾具看起來像:

[TestFixture(Category = "/api/route-to-test")] 
public GetAllTheThings : GetAllRouteTests<TheThing, ModuleTheThings> { } 

這使我能夠在所有運行一些常用的測試獲得所有/列表中的路由。這也意味着我有直接鏈接到正在測試的模塊的類,以及Resharper/Visual Studio/CI中的測試和代碼之間的鏈接「正常工作」。

挑戰在於某些路由需要查詢參數來測試通過路由代碼的其他路徑;

例如/ API /路徑 - 測試?類別=大。

由於[TestCaseSource]需要靜態字段,屬性或方法,因此似乎沒有很好的方法來覆蓋要傳遞的查詢字符串列表。我提出的最接近的東西看起來像一個黑客。即:

public abstract class GetAllRouteTests<TModel, TModule> 
{ 
    [TestCaseSource("StaticToDefineLater")] 
    public void HasModels_ReturnsPagedModel(dynamic args) 
    { 
    // Implemented test 
    } 
} 

[TestFixture(Category = "/api/route-to-test")] 
public GetAllTheThings : GetAllRouteTests<TheThing, ModuleTheThings> 
{ 
    static IEnumerable<dynamic> StaticToDefineLater() 
    { 
     // yield return all the query things 
    } 
} 

這是可行的,因爲靜態方法是爲已實現的測試類定義的,並且由NUnit找到。巨大的黑客。對於其他使用抽象類的人也是有問題的,因爲他們需要「知道」將StaticToDefineLater實現爲靜態。

我正在尋找更好的方法來實現這一目標。看起來好像在NUnit 3.x中刪除了非靜態的TestCaseSource源,所以沒有了。

在此先感謝。

NOTES:

  • GetAllRouteTests <>實現了許多試驗,而不是僅僅示出的一個。
  • 在一次測試中迭代所有路線將「隱藏」所涵蓋的內容,所以想避免這種情況。

回答

4

我解決了類似的問題的方法是通過實現IEnumerable(用於NUnit的其他可接受的源)鹼源類,認爲如果這樣的設計適合您的用例:

// in the parent fixture... 
public abstract class TestCases : IEnumerable 
{ 
    protected abstract List<List<object>> Cases; 

    public IEnumerator GetEnumerator() 
    { 
     return Cases.GetEnumerator(); 
    } 
} 

// in tests 
private class TestCasesForTestFoobar : TestCases 
{ 
    protected override List<List<object>> Cases => /* sets of args */ 
} 

[TestCaseSource(typeof(TestCasesForTestFoobar))] 
public void TestFoobar(List<object> args) 
{ 
    // implemented test 
} 
+3

正如我們預期。 :-)另外,將數據放在單獨的類中,與將其放入測試類中相比,它要乾淨得多。 – Charlie

+0

哦,整潔 - 沒有得到比框架的領導開發支持更好:) – j4nw

+0

那麼是否需要在實施的夾具上定義[TestCaseSource *]屬性?有沒有一種方法可以在父裝置上定義它,以便通用測試可以在基礎/父裝置中實現? – Jason

相關問題