2012-02-17 69 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()失败时使这些方法失败。