当我尝试将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?
如果ValuesAttribute
类型具有带签名ValuesAttribute(params object[] x)
的构造函数重载,则该重载将以其非扩展形式首选。即,你的裸null
将被视为null
类型的object[]
。为避免这种情况,请使用:
[Values((object)null)]
我同意CodingYoshi的说法,你没有太多理由在这里使用ValuesAttribute
。但是,您可能已经发现了一个错误,在这种情况下应该报告并修复它!
您最好使用适当的测试命名约定,例如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)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方法,测试parentSuite),位于NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.BuildFrom(ITypeInfo typeInfo)的NUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.AddTestCasesToFixture(TestFixture fixture) )在NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.BuildFrom(ITypeInfo typeInfo)
这可能是一个错误。但是我没有看到任何强有力的理由使用[Values(null)]
,因为你可以安全地将任何始终为null
的测试用例参数转换为局部变量或完全删除。