2017-05-22 48 views
0

讓我們有這樣的設置:在TestCaseSource(NUnit的)從的TestFixture訪問值

[TestFixture(10)] 
[TestFixture(20)] 
public class TestClass 
{ 
    int I; 

    public TestClass(int i) 
    { 
     I = i; 
    } 

    [TestCaseSource(typeof(TestSource))] 
    public void Test(string name) 
    { 
     TestContext.WriteLine(name); 
    } 

    class TestSource : IEnumerable<TestCaseData> 
    { 
     public IEnumerator<TestCaseData> GetEnumerator() 
     { 
      yield return new TestCaseData("AAA") { TestName = $"Test" };     
     } 

     IEnumerator IEnumerable.GetEnumerator() 
     { 
      return GetEnumerator(); 
     } 
    } 
} 

有沒有辦法生成TestCaseSource測試時以某種方式得到當前TestFixture值(1020在這種情況下)(無論是使用類或方法,對我無關緊要)?我知道我可以解決這個問題,即派生類或複製方法,但我希望獲得乾淨的解決方案(排隊計劃B之前)。

回答

1

對不起,說這不行。 :-(

首先,我們要明確一點,你的嵌套測試用例類沒有特殊的地位,因爲它是嵌套的,它是獨立於測試用具類而實例化的,它的工作原理與它如果是。沒有嵌套

這裏的東西在測試發現時間序列:

  1. NUnit的識別您的測試夾具和注意到的事實,這是將(後來)被實例化兩次,它注意到這給了我們兩個固定裝置,每個固定裝置都需要發現它的測試結果

  2. NUnit查看每個夾具中的所有方法以查找測試。當談到TestCaseSourceAttribute時,它會實例化源類並使用它的IEnumerable接口來獲取測試用例。

以後(秒,分,年?)NUnit執行您的測試。當它到達所討論的夾具時,它將它實例化兩次,一次使用10次,一次使用20次。測試案例先前被識別爲。如你所見,測試夾具在發現測試時甚至沒有實例化。當然,NUnit「知道」這些論點,理論上可以提供某種替代設施,但是不存在這樣的設施 - 並且創建起來會非常複雜,因爲通常它可能涉及模擬夾具方法的任意執行。

在構造函數中存儲參數的值並從測試中訪問它是解決此問題的「標準」方法。如果你想做的事情不會使用這種技術,最好將它更清楚地表達出來,以便我們看看是否有解決方法。

+0

謝謝。我通過調試和測試找到了序列。嵌套類只是SO的一個例子。我會以某種方式分割它,並使用兩個子類來取代使用'TestFixture'。這可能很容易解決它。 –

相關問題