2016-07-13 6 views
1

私は、私はNUnitのを使用して別のインスタンスに対して等価性をチェックサードパーティのライブラリからクラス、FooオーバーライドToStringメソッド

Assert.AreEqual(foo1, foo2); 

を取得しています

Expected: Foo 
But was: Foo 

エラーメッセージはあまり役に立ちません。 NUnitがToStringを使ってエラーメッセージを表示しているのを知っていますが、ここでそれを上書きすることはできません。

NUnitはこの動作をオーバーライドするAPIを提供していますので、自分でToStringの実装を提供できますか? Assert.AreEqualAssert.That APIで何も見ることができません

+0

「Assert.AreEqual」メソッド(3番目のパラメータ)にカスタムエラーメッセージを渡すだけではどうですか? –

+0

これはオプションですが、私の実際のユースケースは 'CollectionAssert'を使ってより複雑なので、メッセージを構築することはToStringのオーバーライドを提供するよりも多くなるでしょう。 – RichK

答えて

5

任意のタイプに特定の書式コードを追加して、NUnitがそれを使用することができます。 https://github.com/nunit/docs/wiki/TestContext#addformatter

この機能はNUnit 3.2で追加されました。

+2

そうですかこれを行う: 'TestContext.AddFormatter(obj == {if(obj == null){return" ";} var foo = objをFoo; if(foo == null){return obj.ToString();}/* * /}); '私はあなたの答えをアップしましたが、リンクの補足として例を挙げることができました。 –

+0

これはまさに私が後にしてくれたことです、ありがとう。私たちは古いバージョンを使用しているため、APIでそれを確認できませんでした。 – RichK

0

これは素晴らしいアプローチではありませんが、別のクラスの中に値をラップしてToString()を上書きすることができます。例えば、テスト・フィクスチャに、次のプライベートクラスを作成します。

private class ValueWrapper 
{ 
    private readonly OtherClass _wrapped; 

    public ValueWrapper(OtherClass wrapped) 
    { 
     _wrapped = wrapped; 
    } 

    public override bool Equals(object obj) 
    { 
     // Compare the wrapped objects for equality. 
     // This needs some beefing up for null checks, type checks, etc. 
     return _wrapped.Equals(obj._wrapped); 
    } 

    public override string ToString() 
    { 
     return "whatever you like"; 
    } 
} 

をこのラッパークラスでは手に、あなたは、あなたの期待&実際の値をラップし、アサートにこれを渡すことができます。 CollectionAssertの場合、Select()LINQ句を使用して、コレクション内の各要素をこれらのいずれかに変換します。

関連する問題