如何使用decimal.MaxValue进行测试?

Max*_*Max 17 c# nunit unit-testing decimal

考虑以下测试:

public void FooTest(decimal? val)
{
    Check.That(true).IsTrue();
}
Run Code Online (Sandbox Code Playgroud)

我想用极值(即MaxValueMinValue)来运行这个测试.

[TestCase(decimal.MaxValue)]
Run Code Online (Sandbox Code Playgroud)

这会输出以下错误:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

[TestCase(79228162514264337593543935)]
Run Code Online (Sandbox Code Playgroud)

我现在得到这个:积分常数太大了

最后一次绝望的尝试:

[TestCase(79228162514264337593543935M)]
Run Code Online (Sandbox Code Playgroud)

显然,由于强制转换,我得到了这个:属性参数必须是属性参数类型的常量表达式,typeof表达式或数组创建表达式

如何用decimal.MaxValue参数编写单元测试?我可以为这个有问题的案例编写一个特定的测试,但我想知道是否有办法写TestCase这样的.

Oli*_*ver 17

现在所有其他人都说过,为什么会出现这个问题,你的代码应该使用该TestCaseSource属性来编写你的测试:

private static object[] TestValues = 
{
    new object[]{ Decimal.MaxValue },
    new object[]{ Decimal.MinValue }
};

[TestCaseSource("TestValues")]
public void FooTest(decimal value)
{
    Assert.That(value, Is.EqualTo(Decimal.MaxValue));
}
Run Code Online (Sandbox Code Playgroud)


Dir*_*irk 6

无论您是尝试使用[TestCase(Decimal.MaxValue)]还是使用文字都没关系[TestCase(1m)].两者都不会起作用.

根据C#规范(17.1.3,属性参数类型):

属性类的位置和命名参数的类型仅限于属性参数类型,它们是:
•以下类型之一:bool,byte,char,double,float,int,long,sbyte,short,string,uint ,ulong,ushort.
•类型对象.
•System.Type类型.
•枚举类型,前提是它具有公共可访问性,并且嵌套类型(如果有)也具有公共可访问性(第17.2节).
•上述类型的一维数组.

请注意第一个列表项中没有小数.

错误消息有点误导,因为相同的规范也说a decimal可以是常量表达式(7.19).

但是如果你在创建时decimal看到IL代码,你会发现它实际上调用了构造函数调用:newobj System.Decimal..ctor.而这不同于其他文字,例如ldc.r8 33 33 33 33 33 33 F3 3Fvar a = 1.2;.


Sri*_*vel 5

Decimal.MaxValue不是常量,它是一个static readonly字段.这意味着您不能在属性中使用它,因为属性需要常量.你必须硬编码.

Visual Studio会假装它作为一个const但实际上并非如此.

bool isConstant = typeof (decimal)
    .GetField("MaxValue", BindingFlags.Static | BindingFlags.Public)
    .IsLiteral;
//isConstant will be false :(
Run Code Online (Sandbox Code Playgroud)

  • @T_D好吧,Jon有一个答案[这里](http://stackoverflow.com/questions/21502561/decimal-source-code-from-ms-source-will-it-build) (3认同)