使用[Range]属性的类常量

时间:2012-02-17 11:29:59

标签: c#-4.0 nunit

对于单元测试,我想使用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中的类常量设置范围参数的方法吗?还是有更优雅的解决方案?

1 个答案:

答案 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()失败时使这些方法失败。