2017-07-28 5 views
0

Visual Studioでnunit testing v2.6.4を使用していますが、私は奇妙なバグを発見しました。このバグは、2つの別個のオブジェクト(ただし同じ型のオブジェクト)、ObjOneおよびObjTwoに対して呼び出されたときに、 "Assert.AreEqual"で発生します。これらの2つのオブジェクトが作成される方法C#nunitアサーションエラー:expectとwasは同じです

* ObjOneは、有効なフィールド(firstNameの= "foo" という、lastNameの= "バー")を使用して作成され

* ObjOneの属性がシリアライズして格納されています。

* ObjOneの属性は非標準化され、ObjTwoに入れられます。

* ObjOneとObjTwoのフィールド値は同じです。

しかし "Assert.AreEqualは" これら二つのオブジェクトで呼び出されたとき、それは私が3つの質問を持っているエラー

"

An exception of type 'NUnit.Framework.AssertionException' occurred in nunit.framework.dll but was not handled in user code 

Additional information: Expected: <NameSpace.TypeOfObjOneAndTwo> 

    But was: <NameSpace.TypeOfObjOneAndTwo> 

"

次戻ります。

  1. 参照が同じかどうかを確認しますか?または値が同じですか? (3.0のドキュメント、hereは、リファレンスではない値をチェックしていますが、このバージョンのnunitではわかりません。ドキュメントは見つかりませんでした)。私は他の要因のために、nunitのバージョンをアップグレードすることはできません。

  2. Assert.AreEqualは、2つのオブジェクトのパブリックフィールド以外の値をチェックしますか?

  3. このエラーの詳細を知りたいのですが? (編集TypeOfObjOneAndTwo後)

+0

これは単にオブジェクトに対して「等しい」を呼び出します。クラスでオーバーライドされていない場合は、参照の平等を実行します。 – juharr

+0

ここでの別のオプションは、クラスのすべてのプロパティが等しいことをアサートすることです。 – juharr

答えて

3

TypeTestクラスはbool Equals(object)をオーバーライドする必要があります。さもなければ、「等しい」という概念は存在しない。

注:を代わりに使用する場合、System.ValueTypeは、Equalsを上書きします。

また、アサーションの失敗メッセージをより良くするには、ToStringを上書きすることもできます。

+1

"TypeTest"がObjOneとObjTwoのタイプであることを明確にするために質問を編集しました。 AHHHがクラス内のbool Equals(オブジェクト)を上書きすると、Assert.AreEqualはそのクラスを使用しますか? –

+1

@ A.sharifはい、また、 'GetHashCode'をオーバーライドすることを忘れないでください。 – juharr

+0

ありがとう!それが問題でした! @Juharrそれは素晴らしい点です!私はGetHashCodeもオーバーライドする必要がある理由を読んでいました。しかし、私はそれを読んだときに混乱していました。クラスが変更された場合(変更可能な場合)、GetHashCodeをオーバーライドしないでください。これはDynamicクラスのようなものですか?それとも、クラスのフィールドをいつでも変更して、GetHashCodeをオーバーライドしないと言っていますか? 。また、私はあなたがこの質問への回答を追加する場合、アップヴォートすることができます。 ここに私が読んでいたリンクhttp://www.loganfranken.com/blog/692/overriding-equals-in-c-part-2/ –

関連する問題