Assert.Contains 在列表中找不到对象

Assert.Contains doesn't find the object in a list

我是单元测试的新手,我想测试一种方法,该方法获取包含一些名称(如“John,Doe”)的字符串数组,然后用“,”拆分名称并填充列表PersonModel 具有这些名称,因此我希望在返回的列表中有一个名字为 John,姓氏为 Doe 的 PersonModel,但是 Assert.Contains 方法不断抛出此错误:

Assert.Contains() Failure

Not found: PersonModel { FirstName = "John", FullName = "John Doe", LastName = "Doe" }

In value: List [PersonModel { FirstName = "John", FullName = "John Doe", LastName = "Doe" }, PersonModel { FirstName = "Jane", FullName = "Jane Doe", LastName = "Doe" }]

这是DataAccessclass:

中的人名转换方法
public static List<PersonModel> ConvertCsvNamesToPeopleList(string[] csvContent)
{
    List<PersonModel> output = new List<PersonModel>();

    foreach (string line in csvContent)
    {
        string[] data = line.Split(',');
        output.Add(new PersonModel { FirstName = data[0], LastName = data[1] });
    }

    return output;
}

这是测试:

[Fact]
public void ConvertCsvNamesToPeopleList_ValidCsvContent_ShouldWork()
{
    string[] csvContent = { "John,Doe", "Jane,Doe" };

    var expectedPerson = new PersonModel { FirstName = "John", LastName = "Doe" };
    var expectedPerson2 = new PersonModel { FirstName = "Jane", LastName = "Doe" };
    var actual = DataAccess.ConvertCsvNamesToPeopleList(csvContent);

    Assert.Contains(expectedPerson, actual);
    Assert.Contains(expectedPerson2, actual);
}

人物模型:

public class PersonModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string FullName => $"{ FirstName } { LastName }";
}

Contains 依赖于找到两个相等的对象,所以你应该覆盖它的 Equals 方法。为了好的措施,你也应该覆盖它的 GetHashCode 方法,这样你就可以在需要时将它用作字典的键:

public override bool Equals(object obj)
{
    return obj is PersonModel model &&
           FirstName == model.FirstName &&
           LastName == model.LastName;
}

public override int GetHashCode()
{
    return HashCode.Combine(FirstName, LastName);
}