C# 如何将空值传递给测试方法的ValuesAttribute?
当我试图将Null值传递给nunit ValuesAttribute时,我得到一个错误 如果将运行此测试,则不会执行该类的所有测试方法:C# 如何将空值传递给测试方法的ValuesAttribute?,c#,nunit,nunit-3.0,C#,Nunit,Nunit 3.0,当我试图将Null值传递给nunit ValuesAttribute时,我得到一个错误 如果将运行此测试,则不会执行该类的所有测试方法: [TestFixture] public class UrlSectionsTests { [Test] public void SetRoot_Throws_ArgumentNullExcpetion( [Values(null)] TestUrlRootSection rootSection ) {
[TestFixture]
public class UrlSectionsTests {
[Test]
public void SetRoot_Throws_ArgumentNullExcpetion(
[Values(null)] TestUrlRootSection rootSection
)
{
Assert.Throws<ArgumentNullException>(() =>
this.urlSections.Root = rootSection);
}
}
[TestFixture]
公共类URLSectests{
[测试]
public void SetRoot\u抛出\u(
[值(null)]TestUrlRootSection
)
{
Assert.Throws(()=>
this.urlSections.Root=rootSection);
}
}
有没有办法将NULL值传递给ValuesAttribute?我同意CodingYoshi的说法,您没有太多理由在这里使用
ValuesAttribute
。但是,您可能发现了一个bug,在这种情况下,应该报告并修复它 我同意CodingYoshi的说法,您没有太多理由在这里使用ValuesAttribute
。但是,您可能发现了一个bug,在这种情况下,应该报告并修复它 如果ValuesAttribute
类型具有带签名的构造函数重载ValuesAttribute(params object[]x)
,则首选非扩展形式的重载。即,您的裸null
将被视为类型为object[]
的null
。要避免这种情况,请使用:
[Values((object)null)]
如果
ValuesAttribute
类型具有带有签名的构造函数重载ValuesAttribute(params object[]x)
,则首选非扩展形式的重载。即,您的裸null
将被视为类型为object[]
的null
。要避免这种情况,请使用:
[Values((object)null)]
您最好使用适当的测试命名约定,例如
UnitOfWork\u StateUnderTest\u ExpectedBehavior()
。在这种特殊情况下,您可以通过ArgumentNullExcpetion()将函数重命名为Root\u SetToNull\u。查看Roy Osherove的文章了解更多信息
如果尝试使用运行此测试用例,您将看到NUnit Framework引发异常:
System.NullReferenceException:对象引用未设置为对象的实例。
位于NUnit.Framework.Internal.ParamAttributeTypeConversions.GetData(对象[]数据,类型targetType)
位于NUnit.Framework.Internal.Builders.ParameterDataSourceProvider.GetDataFor(IPParameterInfo参数)
在NUnit.Framework.CombiningStrategyAttribute.BuildFrom(IMethodInfo方法,测试套件)
位于NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.BuildFrom(IMethodInfo方法,测试父套件)
在NUnit.Framework.Internal.Builders.nunitestFixtureBuilder.AddTestCasesToFixture(TestFixture fixture)中
位于NUnit.Framework.Internal.Builders.nunitestFixtureBuilder.BuildFrom(ITypeInfo类型信息)
位于NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.BuildFrom(ITypeInfo-typeInfo)
这可能是一个bug。但我看不出有任何强有力的理由使用[Values(null)]
,因为您可以安全地将任何总是null
的测试用例参数转换为局部变量或完全删除。您最好使用适当的测试命名约定,例如UnitOfWork\u StateUnderTest\u ExpectedBehavior()
。在这种特殊情况下,您可以通过ArgumentNullExcpetion()将函数重命名为Root\u SetToNull\u。查看Roy Osherove的文章了解更多信息
如果尝试使用运行此测试用例,您将看到NUnit Framework引发异常:
System.NullReferenceException:对象引用未设置为对象的实例。
位于NUnit.Framework.Internal.ParamAttributeTypeConversions.GetData(对象[]数据,类型targetType)
位于NUnit.Framework.Internal.Builders.ParameterDataSourceProvider.GetDataFor(IPParameterInfo参数)
在NUnit.Framework.CombiningStrategyAttribute.BuildFrom(IMethodInfo方法,测试套件)
位于NUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.BuildFrom(IMethodInfo方法,测试父套件)
在NUnit.Framework.Internal.Builders.nunitestFixtureBuilder.AddTestCasesToFixture(TestFixture fixture)中
位于NUnit.Framework.Internal.Builders.nunitestFixtureBuilder.BuildFrom(ITypeInfo类型信息)
位于NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.BuildFrom(ITypeInfo-typeInfo)
这可能是一个bug。但我看不出有任何强有力的理由使用[Values(null)]
,因为您可以安全地将任何总是null
的测试用例参数转换为局部变量或完全删除。您会得到什么错误?另外,如果测试为null,是否需要使用该属性?我的意思是,如果引发异常,您可以将null分配给根目录
,并通过测试。@CodingYoshi当我尝试运行此测试时,我没有收到任何错误消息。它就是不起作用。而且这个测试类也不会显示在测试资源管理器中。请将[TestFixture]
放在类的顶部。@CodingYoshi很抱歉,忘了将它放在我的示例中。但是我的代码中有它。你会得到什么错误?你会得到什么错误?另外,如果测试为null,是否需要使用该属性?我的意思是,如果引发异常,您可以将null分配给根目录
,并通过测试。@CodingYoshi当我尝试运行此测试时,我没有收到任何错误消息。它就是不起作用。而且这个测试类也不会显示在测试资源管理器中。请将[TestFixture]
放在类的顶部。@CodingYoshi很抱歉,忘了将它放在我的示例中。但是我的代码中有它。你会得到什么错误?我更喜欢使用这个属性。这使我有机会在测试方法中保存原始方法签名。我的意思是,它让我有机会看到应该传递给方法的参数。(感谢您的回答!)我更喜欢使用此属性。这使我有机会在测试方法中保存原始方法签名。我的意思是,它让我有机会看到应该传递给方法的参数。(感谢您的回答!)我不明白当方法有三个或更多参数时如何使用名称约定。我的意思是它看起来很不方便