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时。

最佳答案

您只需要像这样覆盖EqualsGetHashCode

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/

10-11 23:05
查看更多