2017-12-09 10 views
0

Null値をValuesAttributeに渡そうとするとエラーが発生します。テストメソッドのValuesAttributeにNULL値を渡す方法は?

このテストを実行する場合は、クラスのすべてのテストメソッドが実行さwill`t:

[TestFixture] 
public class UrlSectionsTests { 

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

はValuesAttributeにNULL値を渡す方法はありますか?

+2

どのようなエラーが表示されますか?また、nullをテストする場合は、属性を使用する必要がありますか?私は 'Root'にnullを代入し、例外がスローされた場合にテストに合格することができます。 – CodingYoshi

+0

@ CodeYoshiこのテストを実行しようとすると、エラーメッセージが表示されません。それは単に働かないだけです。また、このテストクラスはテストエクスプローラに表示されません。 –

+0

'[TestFixture]'をクラスの上に置きます。 – CodingYoshi

答えて

1

タイプのコンストラクタのオーバーロードが、ValuesAttribute(params object[] x)のシグネチャである場合、そのオーバーロードは拡張されていない形式で優先されます。すなわち、あなたの裸のnullは、タイプobject[]nullと見なされます。これを避けるには、UnitOfWork_StateUnderTest_ExpectedBehavior()などの適切なテスト命名規則を使用することをお勧めします。

1

ここではValuesAttributeを使用する理由はあまりないと私は同意します。しかし、あなたはバグを発見しているかもしれません。その場合は報告して修正する必要があります!

+1

この属性を使用することをお勧めします。それは私のテストメソッドで元のメソッドの署名を保存する機会を与えます。つまり、メソッドに渡すべきパラメータを見ることができます。 (ありがとうございました!) –

1

この特殊なケースでは、機能をRoot_SetToNull_ThrowsArgumentNullExcpetion()に変更することができます。詳細についてはRoy OsheroveのNaming standards for unit testsの記事をチェックしてください。

あなたがNUnit Console Runnerを使用して、このテストケースを実行しようとする場合は、その例外はNUnitのフレームワークによってスローされ表示されます。

System.NullReferenceException:オブジェクト参照オブジェクトのインスタンスに設定されていません。 NUnit.Framework.CombiningStrategyAttribute.BuildFrom(IMethodInfo方法でNUnit.Framework.Internal.Builders.ParameterDataSourceProvider.GetDataForでNUnit.Framework.Internal.ParamAttributeTypeConversions.GetData(オブジェクト[]データタイプたtargetType) (IParameterInfoパラメータ) でNUnit.Framework.Internal.BuildersでNUnit.Framework.Internal.Builders.NUnitTestFixtureBuilder.AddTestCasesToFixture(TestFixture具) でNUnit.Framework.Internal.Builders.DefaultTestCaseBuilder.BuildFrom(IMethodInfo法、試験parentSuite) におけるテストスイート) 。 NUnitTestFixtureBuilder.BuildFrom(ITypeInfo typeInfo) NUnit.Framework.Internal.Builders.DefaultSuiteBuilder.BuildFrom(ITypeInfo typeInfo)

これはおそらくバグです。とにかく、常にnullのテストケースパラメータをローカル変数に変更するか、完全に削除することができるので、[Values(null)]を使用する強い理由はありません。

+1

メソッドに3つ以上のパラメータがある場合、名前慣習の使い方を理解できません。私はそれが非常に不便に見えることを意味します。このような場合、メソッドの名前は長く見えなくなり始めます。そのため、[Values(null)]などのメソッドを使用して、メソッド名からすべてのパラメータ値を除外しようとしています。 (あなたの返事ありがとうございます)私は名前の慣習に従わなければならないことを知っていますが、その長い名前が表示されたら=/ –

+1

通常、関数名には実際の引数の値は含まれません。この特定のケースでは、引数値が 'StateUnderTest'の最善の記述であることが起こります。ほとんどの場合、単一のテスト関数を複数の 'TestCaseAttribute'または' ValuesAttribute'インスタンスを持つ関数パラメータに関連付けます。また、実際の引数値ではなく、関数名にそのテストケースの要約を含めます。たとえば、テストケースには、複数の異なるスキーム、権限、パス、クエリ、およびフラグメントが含まれていて、それらのすべてを 'ValidUri'として集計することができます。 –

+1

良い引数値のサマリーは、この作業単位がテストされている状態を読者がよりよく理解できるようにします。値そのものから理解するのが難しい場合があるためです。たとえば、.NET Core Librariesの[UriIPv4Host_BadAddresses_AllFail()](https://github.com/dotnet/corefx/blob/016659c6631ba8f21c359c15a3c6bb5d2a37f322/src/System.Private.Uri/tests/FunctionalTests/UriIpHostTest.cs#L132)を確認してください。明らかに、あなたとあなたのチームにとってはうまくいかない命名規則に従う必要はありません= –

関連する問題