5

私は最近、Google が完全に説明できなかった奇妙な動作に出くわしました。


using Microsoft.VisualStudio.TestTools.UnitTesting;

class TestClass
{
    public override bool Equals(object obj)
    {
        return true;
    }
}

[TestMethod]
public void TestMethod1()
{
    TestClass t = new TestClass ();
    Assert.AreEqual (t, null); // fails
    Assert.IsTrue (t.Equals (null)); // passes
}

このテストは成功すると思います。ただし、Visual Studio 2008 / .NET 3.5 では失敗します。そのようにすることを意図したものですか、それともバグですか?

4

5 に答える 5

15

あなたの TestClass は の契約に違反していObject.Equalsます。Assert.AreEqualかなり合理的に、その契約に依存しています。

ドキュメントの状態(要件のリスト内):

  • x.Equals(null 参照 (Visual Basic では Nothing)) は false を返します。
于 2009-01-20T07:47:57.600 に答える
5

null をテストするときは、 を使用しないでくださいAssert.AreEqual

そのために使わなければなりませんAssert.IsNull()

于 2009-01-20T07:39:35.620 に答える
1

最初のテストは失敗します。新しい TestClass オブジェクトで t を初期化したため、「t」が null であるかどうかをテストします。

t.Equals は常に true を返すため、2 番目のテストはパスします。

1 つのテストが失敗すると、TestMethod1 全体が失敗としてマークされます。

于 2009-01-20T07:40:30.687 に答える
1

いいえ、正解です。t を null ではない新しい TestClass オブジェクトに初期化したため、アサーションは失敗します。

于 2009-01-20T07:48:01.263 に答える
0

私があなたを正しければ、実際にはAreEqual(anythingButNull, null)常にfalseを返すことを意図していますか?

(編集) 私が疑問に思った理由は、クラスの単体テスト時に、Equals の契約で必要とされる null のテストが呼び出されないためです。したがって、AreEqual はコントラクトに依存しているため、クラスもコントラクトに準拠しているかどうかを確認できません。だから私はの回避策を使用する必要があると思いAssert.IsFalse(blah.Equals(null))ます。

于 2009-01-20T07:48:49.033 に答える