我正在阅读Test Driven Development: By Example。所有示例都使用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
调用IEqualityComparer.Equals
。如果我想用override方法比较两个对象,我应该使用什么方法?
更新
我在 Windows 7 , Visual Studio 11 Beta , xunit.net 1.9.0.1566 (从nuget获取文件)进行测试
答案 0 :(得分:7)
在使用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参数)或扩展,我建议使用上面的简单方法。