2017-02-10 24 views
1

私は最初の単体テストクラスを完成させましたが、私のロジックの多くをコピーして貼り付けてしまったという不満を感じました。いくつかの検索後、私は[TestCaseSource][TestCase]は私が潜在的に必要なものであることがわかったが、私は[TestCaseSource]を使用WHE私は、下のメッセージTestCaseSourceまたはTestCaseでオブジェクトを使用しているNunit

結果メッセージを取得:TestCaseSourceAttributeに指定またはsourceNameが静的フィールド、プロパティやメソッドを参照する必要があります。

以下の属性のパラメータの型の発現または配列の作成表現のtypeof属性引数は定数式でなければなりません

または[TestCase]

のエラー1は、[TestCaseSource]を使用するための私のコードです(読みやすいようにtestCaseInputの他の項目を削除しました)

private SomeFormValidator SomeFormValidator; 
    private static MyClass _myClass { get; set; } 
    private readonly object[] testCaseInput = 
    { 
     new object[] { typeof(MyClass), "MyClass is required", _myClass }, 
    }; 

    [SetUp] 
    public void Setup() 
    { 
     SomeFormValidator = new SomeFormValidator(); 
     _myClass = new MyClass(); 
    } 

    [Test, TestCaseSource("testCaseInput")] 
    public void Should_have_error_message_when_property_is_null(string message, object property) 
    { 
     var result = SomeFormValidator.ShouldHaveValidationErrorFor(x=> x.MyClass , property); 
     result.WithErrorMessage(message); 
    } 
以下は210

TestCaseSourceについては[TestCase](私は読みやすく、それを維持するために他の項目を削除した)

private SomeFormValidator SomeFormValidator; 
    const MyClass _myClass = new MyClass(); 
    [SetUp] 
    public void Setup() 
    { 
     SomeFormValidator = new SomeFormValidator(); 
    } 

    [Test] 
    [TestCase("MyClassis required", _myClass)] 
    public void Should_have_error_message_when_property_is_null(string message, object property) 
    { 

     var result = SomeFormValidator.ShouldHaveValidationErrorFor(aup => aup.MyClass, property); 
     result.WithErrorMessage(message); 
    } 
+0

'testCaseInput'のみ'民間readonly'で、それはまた 'static' –

+0

にする必要が転覆は何もコピーではありませんがテストが小さくてシンプルな場合は、テストからテストにいくつかの部分(通常はアレンジセクション)を貼り付けます。そうでない場合、_setup_または_source_メソッドはほとんど問題を解決しません。それについての素晴らしい記事[http://jamesnewkirk.typepad.com/posts/2007/09/why-you-should-.html]があります。 –

答えて

0

を使用するための私のコードであるあなたがstaticメンバーを使用する必要があります属性:

private static readonly object[] testCaseInput = ... 

属性はメタデータですコンパイル時に知っておくべきです。 MyClassのインスタンスを属性に渡そうとしています。しかし、クラスインスタンスは実行時にのみ作成できます。実際には、定数(文字列、ブール値または数値など)、typeof式(つまり、typeof(MyClass)を渡すことができます)または配列作成式(例:new [] { 1, 2, 3 })のみをatrributesに渡すことができます。あなたのケースでは

あなたがテストメソッドにエラーメッセージが表示され、プロパティ名を渡すことができます:

[TestCase("MyClass is required", "MyClass")] 
public void BlahBlah(string message, string propertyName) 
+1

偉大な答え、非常によく説明されています。私は名前をハードコードする必要がないように、 'nameof()'演算子を使って静的変数の単純な(非修飾の)文字列名を取得します: '[Test、TestCaseSource(nameof(testCaseInput))]' ' –

関連する問題