gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:56:48 25 4
gpt4 key购买 nike

我正在阅读 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 .如果我想用覆盖方法比较两个对象,我应该使用什么方法?

更新
我在 上测试了这个Windows 7 , Visual Studio 11 测试版 , xunit.net 1.9.0.1566 (从nuget获取文件)

最佳答案

在使用 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 参数)或扩展之前,我建议使用上面的简单方法。

关于unit-testing - 如何在 xunit.net 中测试两个对象是否相等?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10365699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com