簡體   English   中英

從TestCaseSource(NUnit)中的TestFixture訪問值

[英]Accessing value from TestFixture in TestCaseSource (NUnit)

讓我們進行以下設置:

[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排隊之前)。

抱歉地說這行不通。 :-(

首先,讓我們清楚一點,由於嵌套,嵌套的testcasesource類在NUnit中沒有特殊的地位。 它獨立於測試夾具類進行實例化,並且與未嵌套時的工作原理完全相同。

這是測試發現時的順序:

  1. NUnit標識您的測試治具,並注意將其(以后)實例化兩次的事實。 它記錄了用於命名目的的參數。 這給了我們兩個夾具,每個夾具都需要進行測試。

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

稍后(幾秒鍾,幾分鍾,幾年?),NUnit執行您的測試。 當它到達所討論的燈具時,將其實例化兩次,一次使用10,一次使用20。運行先前確定的測試用例。

如您所見,在發現測試時,甚至沒有實例化測試夾具。 當然,NUnit“知道”這些參數,並且理論上可以提供某種替代工具,但是這種替代工具不存在-創建起來將非常復雜,因為通常它可能涉及模擬夾具方法的任意執行。

將參數的值存儲在構造函數中並從測試中訪問它是解決此問題的“標准”方法。 如果您要執行的某項操作無法使用該技術,則最好將其拼寫清楚,以便我們查看是否有解決方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM