XUnit并没有断言以下事实(StartDate和EndDate是DatePeriod仅有的两个公共属性):
var actual = new List<DatePeriod>()
{
new DatePeriod() { StartDate = new DateTime(2017, 1, 20), EndDate = new DateTime(2018, 1, 19)},
new DatePeriod() { StartDate = new DateTime(2018, 1, 20), EndDate = new DateTime(2018, 3, 31)}
};
var expected = new List<DatePeriod>()
{
new DatePeriod() { StartDate = new DateTime(2017, 1, 20), EndDate = new DateTime(2018, 1, 19)},
new DatePeriod() { StartDate = new DateTime(2018, 1, 20), EndDate = new DateTime(2018, 3, 31)}
};
Assert.Equal(actual, expected);
根据一些研究,我希望在最新版本的XUnit中,只要使用顺序相同,就可以认为它们相等,因为使用Assert时。
最佳答案
您只需要像这样覆盖Equals
和GetHashCode
:
public class DatePeriod
{
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
DatePeriod other = (DatePeriod)obj;
return StartDate.Equals(other.StartDate) && EndDate.Equals(other.EndDate);
}
public override int GetHashCode()
{
return new {StartDate, EndDate}.GetHashCode();
}
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
xUnit在可以调用
Assert.Equal
的意义上识别集合,而其他测试框架则需要诸如CollectionAssert.AreEqual
之类的特殊方法。在所有情况下,框架都将为列表中的每个项目调用
Equals
,并从另一个列表传递相应的项目。如果您有字符串或整数列表,则默认情况下正确实现Equals
。对于DatePeriod
之类的自定义对象,Equals
方法的默认实现基于引用相等,即,两个对象相等,因为它们实际上是同一对象。为了获得基于价值的平等,您必须重写Equals
方法(也建议使用GetHashCode
方法)。关于c# - 将两个List <T>与XUnit Assert函数进行比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36267753/