Unit testing 如何在xunit.net中测试两个对象是否相等?

Unit testing 如何在xunit.net中测试两个对象是否相等?,unit-testing,xunit.net,Unit Testing,Xunit.net,我正在读书。所有示例都使用Java和Junit(我在第10章)。有一种测试方法可以测试两个对象是否相等。我已经重写了类的等于,但在运行测试时失败了 这是示例代码 public class BaseX { public string Test { get; set; } public override bool Equals(object obj) { return this.Test == ((BaseX)obj).Test; } pu

我正在读书。所有示例都使用Java和Junit(我在第10章)。有一种测试方法可以测试两个对象是否相等。我已经重写了类的等于,但在运行测试时失败了

这是示例代码

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
call
IEqualityComparer.Equals
。如果我想用覆盖方法比较两个对象,我应该使用什么方法

更新

我在Windows 7Visual Studio 11 Betaxunit.net 1.9.0.1566(从nuget获取文件)

上测试了这一点。在使用T的Equals方法比较两个对象之前,xunit比较了类型:

// Same type?
if (!skipTypeCheck && x.GetType() != y.GetType())
    return false;
在我看来,你有两个选择:

简单的选择

Assert.True(b1.Equals(a1));
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.True(b1.Equals(a1));
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();
    }
}

在此情况下,考虑。


除非有人添加一个新的重载(这应该不难,因为内部实现有一个bool参数)或扩展,否则我建议使用上面的简单方法。

Test
是受保护的,那么您如何才能说
var b1.Text=“a”在测试中?在任何情况下,如果您将
Test
公开,然后运行您在本问题中提供的代码,则在我尝试时通过。我只是更新了代码,还添加了有关我的机器的信息。:)对我来说,它通过实现IEquatable起作用;xUnit与此接口兼容。