8

私はテスト駆動開発を読んでいます:例によって。すべての例でJavaとJunitを使用しています(私は第10章にいます)。2つのオブジェクトの同等性をテストする1つのテスト方法があります。私はすでにクラスのEqualsをオーバーライドしていますが、テストを実行すると失敗しました。

これはサンプルコードです

public class BaseX
{
    public string Test { get; set; }

    public override bool Equals(object obj)
    {
        return this.Test == ((BaseX)obj).Test;
    }

    public override string ToString()
    {
        return string.Format("Tyep: {0}, Test: {1}", this.GetType().Name, this.Test);
    }
}

public class A : BaseX
{

}

これは私のテストコードです

[Fact]
public void FunTest2()
{
    var b1 = new BaseX();
    var a1 = new A();

    b1.Test = "a";
    a1.Test = "a";

    Assert.Equal(a1, b1);
}

テストを実行すると、このメッセージで失敗します。

TDD1.UnitTest.UnitTest1.FunTest2 : Assert.Equal() Failure
Expected: Tyep: A, Test: a
Actual:   Tyep: BaseX, Test: a

Assert.Equalオブジェクトの値とタイプの両方を比較すると思います。そこで、xunitコードを調べて、そのAssert.Equal呼び出しを見つけましたIEqualityComparer.Equals。2つのオブジェクトをオーバーライドメソッドと比較したい場合、どのメソッドを使用する必要がありますか?

アップデート
私はこれをWindows7Visual Studio 11 Betaxunit.net 1.9.0.1566(nugetからファイルを取得)でテストします

4

1 に答える 1

7

T の Equals メソッドを使用して両方のオブジェクトを比較する前に、xunit は型を比較します。

// Same type?
if (!skipTypeCheck && x.GetType() != y.GetType())
    return false;

ご覧のとおり、次の 2 つの選択肢があります。

シンプルな選択

Assert.True(b1.Equals(a1));

Equal オーバーロードほど期待できないかもしれませんが、KISS...

あまり単純でない選択

public class BaseXComparer : IEqualityComparer<BaseX>
{
    public bool Equals(BaseX x, BaseX y)
    {
        return x.Test.Equals(y.Test);
    }

    public int GetHashCode(BaseX obj)
    {
        return obj.Test.GetHashCode();
    }
}

その後:

Assert.Equal(a1, b1, new BaseXComparer());

この場合、これを考慮してください。

誰かが新しいオーバーロード (内部の実装にはこのための bool パラメーターがあるため、難しいことではありません) または拡張機能を追加するまでは、上記の単純な方法を使用することをお勧めします。

于 2012-04-29T15:49:19.803 に答える