2012-02-17 74 views
2

對於單元測試,我希望使用NUnit中的Range attribute來測試範圍內函數的輸入。該範圍的下限和上限被編碼爲(Singleton模式)類的不變屬性。我想用類屬性指定Range attribute的出發點和落腳點,是這樣的:對[Range]屬性使用類常量

[Test] 
public void sometest([Range(MyClass.LOWER_LIMIT,MyClass.UPPER_LIMIT)] int var) 
{ 
    //Do something and assertive with the nice variable 
} 

然而,這種方法是行不通的。雖然從文檔本身並不清楚,但似乎Range attribute必須提供常量變量。雖然我的類常量是隻有被定義的靜態屬性,但它確實捕獲了一個常量變量。

我發佈並回答了這個問題,但這真的是在NUnit中根據類常量設置範圍參數的方法嗎?還是有更優雅的解決方案?

回答

2

以下示例演示瞭如何使用NUnit中的Range屬性所使用的值作爲值的(常量)屬性。

const int LO_LIM = 1; 
const int HI_LIM = 10; 

[Test] 
public void assertConstantsCorrect() 
{ 
    //Will fail if constants change during development! 
    Assert.AreEqual(MyClass.LOWER_LIMIT,LO_LIM); 
    Assert.AreEqual(MyClass.UPPER_LIMIT,HI_LIM); 
} 

[Test] 
public void sometest([Range(LO_LIM,HI_LIM)] int var) 
{ 
    //Do test 
} 

的第一步是在您的測試類中定義的常量,作爲Range屬性只與常數工作。這些常量與您的類的屬性中定義的常量具有相同的值。

其次是創建一個測試來驗證它們是否對應。如果在以後的日期和時間MyClass中的常數發生變化,則此測試中的失敗將通知您此更改。請注意,如果此測試未通過,則使用這些常量的任何其他測試可視爲無效,因爲它們依賴於虛假假設!

Lasty是您在[Range(start, end)]條款中使用這些值的實際測試。

另外,您還可以使用[TestFixtureSetUp]屬性,而不是[Test]屬性爲assertConstantsCorrect()方法,使在夾具上的所有測試,以防assertConstantsCorrect()失敗失敗。 另一種替代方法是使自定義屬性適用於您作爲程序員註釋的特定方法,並在assertConstantsCorrect()失敗時使這些方法失敗。