2010-02-18 41 views
6

我正在使用NUnit 2.5.3 TestCaseSource屬性並創建一個工廠來生成我的測試。事情是這樣的:NUnit TestCaseSource將值傳遞給工廠

[Test, TestCaseSource(typeof(TestCaseFactories), "VariableString")] 
public void Does_Pass_Standard_Description_Tests(string text) 
{ 
    Item obj = new Item(); 
    obj.Description = text; 
} 

我的來源是這樣的:

public static IEnumerable<TestCaseData> VariableString 
{ 
    get 
    { 
     yield return new TestCaseData(string.Empty).Throws(typeof(PreconditionException)) 
      .SetName("Does_Reject_Empty_Text"); 
     yield return new TestCaseData(null).Throws(typeof(PreconditionException)) 
      .SetName("Does_Reject_Null_Text"); 
     yield return new TestCaseData(" ").Throws(typeof(PreconditionException)) 
      .SetName("Does_Reject_Whitespace_Text"); 
    } 
} 

我需要能夠做的是一個最大長度檢查添加到變量字符串,但這個最大長度定義被測班級的合同。在我們的例子中,它是一個簡單的公共結構:

public struct ItemLengths 
    { 
     public const int Description = 255; 
    } 

我找不到任何將值傳遞給測試用例生成器的方法。我已經嘗試了靜態共享值,但這些都沒有找到。我不想將文件保存到文件中,因爲每次代碼更改時都需要重新生成此文件。

我想下面的行添加到我的測試用例:

yield return new TestCaseData(new string('A', MAX_LENGTH_HERE + 1)) 
    .Throws(typeof(PreconditionException)); 

東西在概念上非常簡單的事,但我發現不可能做到的。有什麼建議麼?

回答

2

將測試的參數更改爲類而不是字符串。如下所示:

public class StringTest {string 0} public string testString; public int maxLength; }

然後構造這個類作爲參數傳遞給TestCaseData構造函數。這樣你可以傳遞字符串和你喜歡的任何其他參數。

另一種選擇是讓測試有2個字符串和int的參數。

然後爲TestCaseData(「mystring」,255)。你是否意識到他們可以有多個參數?

韋恩

1

我遇到了類似的問題,像你這樣,結束了寫一個小插件的NUnit和延伸NUnit的TestCaseSourceAttribute自定義屬性。在我的特殊情況下,我不想將參數傳遞給工廠方法,但您可以輕鬆使用相同的技術來實現您想要的。

這並不是很難,只需要我寫三個小類的東西。您可以在以下網址閱讀有關我的解決方案的更多信息:blackbox testing with nunit using a custom testcasesource

PS。爲了使用這種技術,你必須使用NUnit 2.5(至少)祝你好運。