如何将 NULL 值传递给测试方法的 ValuesAttribute?

How to pass NULL value to ValuesAttribute of the test method?

当我尝试将 Null 值传递给 nunit ValuesAttribute 时出现错误。

如果运行这个测试,class的所有测试方法都不会被执行:

[TestFixture]
public class UrlSectionsTests {

    [Test]
    public void SetRoot_Throws_ArgumentNullExcpetion(
        [Values(null)] TestUrlRootSection rootSection
        )
    {
        Assert.Throws<ArgumentNullException>(() => 
            this.urlSections.Root = rootSection);
    }
}

有没有办法将 NULL 值传递给 ValuesAttribute?

我同意 CodingYoshi 的观点,您没有太多理由在这里使用 ValuesAttribute。但是,您可能发现了一个错误,在这种情况下应该报告并修复它!

如果 ValuesAttribute 类型具有带有签名 ValuesAttribute(params object[] x) 的构造函数重载,则该重载将优先采用其非扩展形式。即,您的裸 null 将被视为 object[] 类型的 null。为避免这种情况,请使用:

[Values((object)null)]

您最好使用适当的测试命名约定,例如 UnitOfWork_StateUnderTest_ExpectedBehavior()。在这种特殊情况下,您可以将函数重命名为 Root_SetToNull_ThrowsArgumentNullExcpetion()。查看 Roy Osherove 的 Naming standards for unit tests 文章了解更多信息。

如果您尝试 运行 使用 NUnit Console Runner 这个测试用例,您将看到 NUnit 框架抛出异常:

System.NullReferenceException: Object reference not set to an instance of an object. at NUnit.Framework.Internal.ParamAttributeTypeConversions.GetData(Object[] data, Type targetType) at NUnit.Framework.Internal.Builders.ParameterDataSourceProvider.GetDataFor(IParameterInfo parameter) at NUnit.Framework.CombiningStrategyAttribute.BuildFrom(IMethodInfo method, Test suite) at NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.BuildFrom(IMethodInfo method, Test parentSuite) at NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.AddTestCasesToFixture(TestFixture fixture) at NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.BuildFrom(ITypeInfo typeInfo) at NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.BuildFrom(ITypeInfo typeInfo)

这可能是一个错误。但无论如何我看不出有任何强有力的理由使用 [Values(null)],因为您可以安全地将始终为 null 的任何测试用例参数转换为局部变量或完全删除。