【问题标题】:Unit test fails with contradicting message单元测试失败,消息矛盾
【发布时间】:2013-11-06 17:44:43
【问题描述】:

我有一个名为 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
{
}

使用最小起订量我有这个测试:

    [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));

有人见过吗?

【问题讨论】:

  • 我只能假设 AreEqual 将对这两个明显具有不同引用的对象进行引用检查
  • 不过,这并不能解释异常。该例外似乎暗示类型不一致。我见过这样的异常,错误消息中指定的两种类型似乎相同;非常恼人。
  • 这个测试过去可以通过,但是突然停止了,这就是为什么我很困惑。 AreEqual 没有用来做参考检查...
  • @RobertHarvey NUnit 使用对象的 ToString 方法来显示错误消息。它默认返回类型名称。
  • Assert.AreEqual 测试是否相等,而不是相同(引用相等)。 Assert.AreSame,用于此。但是,AreEqual 确实默认为类的相同性,因为引用相等是这些类的默认实现。

标签: unit-testing c#-4.0 moq type-assertion


【解决方案1】:

您是否尝试过覆盖GetHashCode?强烈建议在覆盖Equals 时覆盖此方法,因为当不同对象的哈希码不匹配时,将永远不会调用Equals

这可能是调用时发生的情况

 Assert.AreEqual(c1, c2);

附带说明,您的 Equals 实现不遵循 Guarantees of Equals

【讨论】:

  • 我应该提到我已经覆盖了 GetHashCode。我会更新我的问题
  • 我正在考虑使用 Equals 和 GetHashcode 的 ReSharper 默认实现,但我担心 Comparer 类可能会受到影响......我担心我会破坏现有功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
相关资源
最近更新 更多