我的一个单元测试有这个签名:
public void FooWithFilter(string fooId, decimal? amount)
当我用 null 测试它时,它有效:
[InlineData("123", null)]
但如果我使用实际值,例如:
[InlineData("123", 610)]
我得到一个错误:
System.ArgumentException Object of type 'System.Int32' cannot be
converted to type 'System.Nullable`1[System.Decimal]'.
我尝试使用 610M
作为属性值,但不允许将其用作属性值:
An attribute argument must be a constant expression, type of expression
or array creation expression of an attribute parameter type.
有没有办法在这里使用可为空的小数?
如评论中所述,您不能使用 decimal
这里是因为decimal
不是属性参数值中允许的类型之一。
但是,xUnit 提供了一种更灵活的方法来将参数值传递给测试方法,使用 ClassData
:
[Theory]
[ClassData(typeof(FooDataGenerator))]
public void FooWithFilter(string fooId, decimal? amount)
要使用它,您只需定义一个扩展 IEnumerable<object[]>
的类并产生你想要的输入值:
public class FooDataGenerator : IEnumerable<object[]>
{
private readonly List<object[]> _data = new List<object[]>
{
new object[] {"123", null},
new object[] {"123", 610M}
};
public IEnumerator<object[]> GetEnumerator() => _data.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
关于将值传递给 xUnit 测试的各种方法的一些进一步引用:
Creating Parameterised tests in xUnit
xUnit Theory: Working With InlineData, MemberData, ClassData
我是一名优秀的程序员,十分优秀!