2017-05-09 3 views
0

NUnitでのすべての種類のパラメータ化されたテストのためのResult - 引数があります。これは、等価性が.NETに組み込まれている単純な型に対してうまく機能します。 target.DoSomething返しますMyTypeテストのインスタンスを想定しNUnits結果の平等性を提供する

[TestCase("MyValue", Result = new MyType(...) /* doesn´t work as we can only use compile-time constants for attributes */] 
public MyType Check(string value) 
{ 
    var target = ... 
    return target.DoSomething(value); 
} 

返されるインスタンスは、私は私のTestCase内に設けたものに等しいことを確認する必要があります:テスト方法を確認するthere'saの方法は、複雑なオブジェクトを返す場合しかし、私は疑問に思います。 MyTypeはいずれもIEquatableも実装していないので、Equalsの同等性はReferenceEqualsを使用して決定されますが、それはもちろん間違っています。さらに私のコメントで述べたように、コンパイル時定数がないので、属性内にMyTypeのインスタンスを作成できません。

私たちのテストにどのように複雑なインスタンスを提供し、結果がそれと等しいかどうかを確認するにはどうすればよいですか?

答えて

0

これには、テストケースに対してより洗練された使用を提供するメンバーを特定できるようにするために、TestCaseSource属性を使用できます。したがって、任意のタイプの複雑なインスタンスを返すこともできます。しかし、すでに述べたように、ReferencEEqualsを使用するデフォルトの比較処理ツールを使用して、提供されたインスタンスと暗黙的に比較されるので、TestCaseResultタグに頼ることはできません。

だから我々はResultとして期待される結果を提供ドントが、テストのような単純な引数と同じcondideredされているもののために私たち自身のロジックを提供:

[TestCaseSource("TestcaseMethod")] 
public MyType Check(string value, MyType expected) 
{ 
    var target = ... 
    var actual = target.DoSomething(value); 
    bool retVal = // check the properties of actual towards those of expected 
    Assert.IsTrue(retVal); 
} 
public IEnumerable<object> TestcaseMethod() 
{ 
    yield return new object[] { "MyValue", new MyType(/* expected outcome */); 
    yield return new object[] { "AnotherValue", new MyType(/* expected outcome */); 
} 

public class MyType 
{ 
    // here come the actual values to be compared 
} 

EDIT: Assert文で平等をチェックするより簡単な方法は、EqualConstraint

Assert.That(expected, Is.EqualTo(actual).Using(new MyComparer()); 
を使用することです

カスタムコンペアーを使用します。

+1

たとえば、FluentAssertionsライブラリには、複雑な型をその値で比較するアサーション拡張メソッド 'actual.ShouldBeEquivalentTo(expected)'があります。答えには素敵なメッセージが追加されます – Fabio

0

Fody Equalsを使用してカスタムクラスEqualsを比較するときは、インストールするナゲットパケットがあります。これを使って、ヘッダーデコレータとしてEqualsを入れて、それを適切に比較できるようにします。

+0

その属性は 'MyType'に私が避けたいと思うテストのために。私はむしろ実際のテストの中でその論理を適用するでしょう。 – HimBromBeere

0

ExpectedResult属性は単なる構文上の優しさであり、決して必要ではありません。メソッドに余分な引数を追加して期待値を与え、テスト内で好きな方法でテストすることができます。

私たちはあなたのExpectedResultを確認するためにNUnitが使用する内部同値比較を強化する予定はありません。

+0

それは私がすでに自分の答えで書いたものですが、これを支持することはないと指摘してくれてありがとう。 – HimBromBeere

+0

実際にあなたの答え(自分の答えた、私は推測する)は私のために私が私を投稿したときにはなかった。しかし、これを見ると、NUnitはReferenceEqualsを使用して期待される結果が得られます。それは正しくありません。これは、自分で書くEqualConstraintとまったく同じ比較を使用します。 – Charlie

+0

あなたのケースでは、期待された結果であろうとコード内での直接アサーションであろうと、ReferenceEqualsを使用していました。他のケースでは、何らかの方法で平等を上書きした他のユーザーにとっては、そうではありません。 – Charlie

関連する問題