为什么 NUnit 告诉我“没有提供足够的参数,至少提供 2 个参数”当我提供 2 个参数时?

问题描述

鉴于我有以下 TestFixtureTestCase 参数作为 decimal,int 对(因为 C# 不直接在属性支持 decimal)。

[TestFixture]
public static class GetNumberOfSignificantDecimalPlacesTests
{
    public static IEnumerable<object[]> DecimalTestData { get; } = new[]
    {
        new object[]
        {
            new[]
            {
                0m,0
            }
        },new object[]
        {
            new[]
            {
                0.1m,1
            }
        },new object[]
        {
            new[]
            {
                -0.1m,1
            }
        }
    };

    [TestCaseSource(nameof(DecimalTestData))]
    public static void ShouldIdentifyTheCorrectNumberOfDecimalPlaces(decimal @decimal,int expected)
        => Assert.AreEqual
        (
            expected,Math.DigitExtensions.GetNumberOfSignificantDecimalPlaces(@decimal)
        );

当我尝试运行这些测试时,为什么会从 N-Unit 收到以下异常?

提供的参数不足,请提供至少 2 个参数。

我以相同的方式编写了更复杂的数据驱动单元测试,其中每个参数都是我制作的自定义 IEnumerablestruct,并且让它们运行没有问题,那么为什么 N -Unit 对什么应该是更简单的单元测试有疑问?

解决方法

您没有向方法传递两个参数,而是只传递一个参数。例如,第一个调用传递一个 object[],其中包含两个值,0m0

我发现使用对象数组传递信息时很容易混淆,当然,它不是类型安全的。即使它不会让您感到困惑,也可能会让阅读您代码的人感到困惑。

我倾向于这样做...

public static IEnumerable<TestCaseData> DecimalTestData { get; } = new[]
{
    new TestCaseData(0m,0),...
}

我发现它更具可读性,并且还让您有机会执行诸如分配测试名称、忽略某些测试等操作。