对于单元测试,我想使用NUnit中的Range attribute
来测试范围内函数的输入。该范围的下限和上限被编码为(单例模式)类的常量属性。我想用类属性指定Range attribute
的起点和终点,如下所示:
[Test]
public void sometest([Range(MyClass.LOWER_LIMIT,MyClass.UPPER_LIMIT)] int var)
{
//Do something and assertive with the nice variable
}
但是,这种方法不起作用。虽然文档本身并不清楚,但Range attribute
似乎必须提供常量变量。虽然我的类常量是静态属性,只有get定义,但它确实捕获了一个常量变量。
我发布并回答了这个问题,但是这真的是基于NUnit中的类常量设置范围参数的方法吗?还是有更优雅的解决方案?
答案 0 :(得分: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()
失败时使这些方法失败。