【问题标题】:How to test two objects are equal in xunit.net?如何在 xunit.net 中测试两个对象是否相等?
【发布时间】:2012-04-29 23:49:19
【问题描述】:

我正在阅读Test Driven Development: By Example。所有示例都使用 Java 和 Junit(我在第 10 章)。有一种测试方法可以测试两个对象是否相等。我已经覆盖了该类的 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。如果我想用 override 方法比较两个对象,我应该使用什么方法?

更新
我在 Windows 7、Visual Studio 11 Beta、xunit.net 1.9.0.1566(从 nuget 获取文件)

上对此进行了测试

【问题讨论】:

  • Test 是受保护的,那么你怎么能在测试中说出var b1.Text = "a"; 呢?在任何情况下,如果您将Test 设为公开,然后运行您在此问题中提供的代码,我尝试时它就会通过。
  • 我刚刚更新了我的代码并添加了关于我的机器的信息。 :)

标签: unit-testing xunit.net


【解决方案1】:

在使用 T 的 Equals 方法比较两个对象之前,xunit 会比较类型:

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

在我看来,你有两个选择:

简单的选择

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

在这种情况下,请考虑this。

直到有人添加新的重载(不应该很棘手,因为内部实现为此有一个 bool 参数)或扩展,我建议使用上面的简单方法。

【讨论】:

  • 对我来说,它通过实现 IEquatable; xUnit 与此接口兼容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 2023-03-07
相关资源
最近更新 更多