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

时间:2017-12-09 19:41:01

标签: c# nunit nunit-3.0

当我尝试将Null值传递给nunit ValuesAttribute时,我收到错误。

如果要运行此测试,将执行该类的所有测试方法:

[TestFixture]
public class UrlSectionsTests {

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

[Values((object)null)]

答案 2 :(得分:1)

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

如果您尝试使用NUnit Console Runner运行此测试用例,您将看到NUnit Framework抛出异常:

  

System.NullReferenceException:未将对象引用设置为对象的实例。      at NUnit.Framework.Internal.ParamAttributeTypeConversions.GetData(Object [] data,Type targetType)      在NUnit.Framework.Internal.Builders.ParameterDataSourceProvider.GetDataFor(IParameterInfo参数)      在NUnit.Framework.CombiningStrategyAttribute.BuildFrom(IMethodInfo方法,测试套件)      在NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.BuildFrom(IMethodInfo方法,测试parentSuite)      在NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.AddTestCasesToFixture(TestFixture fixture)      at NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.BuildFrom(ITypeInfo typeInfo)      在NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.BuildFrom(ITypeInfo typeInfo)

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