C# 如何将空值传递给测试方法的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 ) {

当我试图将Null值传递给nunit ValuesAttribute时,我得到一个错误

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

[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很抱歉,忘了将它放在我的示例中。但是我的代码中有它。你会得到什么错误?我更喜欢使用这个属性。这使我有机会在测试方法中保存原始方法签名。我的意思是,它让我有机会看到应该传递给方法的参数。(感谢您的回答!)我更喜欢使用此属性。这使我有机会在测试方法中保存原始方法签名。我的意思是,它让我有机会看到应该传递给方法的参数。(感谢您的回答!)我不明白当方法有三个或更多参数时如何使用名称约定。我的意思是它看起来很不方便