如何将 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
的任何测试用例参数转换为局部变量或完全删除。
当我尝试将 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
的任何测试用例参数转换为局部变量或完全删除。