0

Contentから継承するというオブジェクトがありますContentBase

ContentBaseいくつかのプロパティを持つ基本的なクラスです。 Content完全に空です。からすべてを継承するだけContentBaseです。

public class ContentBase
{
    public virtual int Id { get; set; }
    public virtual string Application { get; set; }
    public virtual string Property1 { get; set; }
    public virtual string Property2 { get; set; }
}

public class Content : ContentBase
{
}

Moqを使用して、このテストがあります:

    [Test]
    public void AreEqual_Test()
    {
        var c1 = new Content() { CultureCode = "Code", ResourceKey = "key", ResourceType = "type", ResourceValue = "value" };
        var c2 = new Content() { CultureCode = "Code", ResourceKey = "key", ResourceType = "type", ResourceValue = "value" };

        Assert.AreEqual(c1, c2);
    }

次のメッセージで失敗します。

Expected: <WebPortal.DomainModels.PresentationModel.Content>
But was:  <WebPortal.DomainModels.PresentationModel.Content>

at 
NUnit.Framework.Assert.That(Object actual, IResolveConstraint expression, String message, Object[] args)
   at WebPortal.DomainModels.Tests.PresentationModel.ContentTests.AreEqual_Test() in ContentTests.cs: line 16

これは、Content が ContentBase から継承されていない場合には発生しませんでしたが、それでも、エラー メッセージがばかげていることがわかりました。

Content クラスには、次の Equals が含まれています。

 public override bool Equals(object obj)
    {
        var content = (Content)obj;
        return this.ResourceKey == content.ResourceKey && this.ResourceType == content.ResourceType && this.CultureCode == content.CultureCode;
    }

 public override int GetHashCode()
    {
        return this.Id.GetHashCode() + this.Application.GetHashCode();
    }

失敗した Assert は Equals メソッドをトリガーしません

Assert.AreEqual(c1, c2);

ただし、以下の Assert は Equals をトリガーし、テストはパスします。

Assert.IsTrue(c1.Equals(c2));

誰もこれを見たことがありますか?

4

1 に答える 1

0

オーバーライドしようとしましたGetHashCodeか? Equals異なるオブジェクトのハッシュコードが一致しない場合は呼び出されないため、オーバーライドする場合はこのメソッドをオーバーライドすることを強くお勧めしますEquals

これは、呼び出し時に起こっている可能性があります

 Assert.AreEqual(c1, c2);

補足として、Equals の実装は、Equals の保証に従っていません。

于 2013-11-07T17:23:20.217 に答える