如何使用decimal.MaxValue进行测试
本文关键字:测试 MaxValue 何使用 decimal | 更新日期: 2023-09-27 18:16:10
考虑以下测试:
public void FooTest(decimal? val)
{
Check.That(true).IsTrue();
}
我想用极值运行这个测试(即MaxValue
和MinValue
)。
[TestCase(decimal.MaxValue)]
属性参数必须是属性参数类型
的常量表达式、typeof表达式或数组创建表达式。[TestCase(79228162514264337593543935)]
我现在得到这个:积分常数太大
最后一次尝试:
[TestCase(79228162514264337593543935M)]
显然我得到这个是因为强制转换:属性参数必须是属性参数类型
的常量表达式,typeof表达式或数组创建表达式如何写一个单元测试与decimal.MaxValue
作为参数?我可以为这个有问题的情况编写一个特定的测试,但我想知道是否有一种方法来编写这样的TestCase
。
现在所有其他人都说了,为什么会出现这个问题,您的代码应该使用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));
}
十进制。MaxValue不是一个常量,它是一个static
readonly
字段。这意味着你不能在属性中使用它,因为属性需要常量。你必须硬编码。
Visual studio会假装它是一个const
,但实际上它不是。
bool isConstant = typeof (decimal)
.GetField("MaxValue", BindingFlags.Static | BindingFlags.Public)
.IsLiteral;
//isConstant will be false :(
您是否尝试使用[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)。
•上述类型的一维数组。
注意第一个列表项中没有小数。
错误信息有点误导,因为同一规范还说decimal
可以是常量表达式(7.19)。
但是,如果您在创建decimal
时查看IL代码,您将看到它实际上调用了构造函数调用:newobj System.Decimal..ctor
。这与其他文字不同,例如ldc.r8 33 33 33 33 33 33 F3 3F
代替var a = 1.2;
。