【发布时间】:2022-01-23 01:17:26
【问题描述】:
我是单元测试的新手,我想测试一个方法,该方法获取一个字符串数组,其中包含一些名称,如“John,Doe”,然后它用“,”分割名称并填充@列表987654326@ 带有这些名称,所以我希望在返回的列表中有一个名字为 John 和姓氏 Doe 的 PersonModel,但 Assert.Contains 方法不断抛出此错误:
Assert.Contains() 失败
未找到:PersonModel { FirstName = "John", FullName = "John Doe", 姓氏 = "Doe" }
在值:列表 [PersonModel { FirstName = "John", FullName = "John Doe", LastName = "Doe" }, PersonModel { FirstName = “Jane”,FullName = “Jane Doe”,LastName = “Doe”}]
这是DataAccess类中将姓名转换为人员列表的方法:
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 }";
}
【问题讨论】:
-
PersonModel是否覆盖Equals? -
@Mureinik 不,它没有
-
而
PersonModel是class,对吗?不是record或struct?你遇到的是reference vs value equality。对象具有相同的值,但在内存中不是同一个对象,因此不相等。 -
看看Best way to compare two complex objects。有多种方法可以按值比较类实例。正如@Mureinik 指出的那样,最简单的方法是override
Equals。 -
别担心!值得注意的是,如果您使用
record的实例(在 C# 9.0 或更高版本中可用),您可以免费获得此功能:Try it out on .NET Fiddle
标签: c# unit-testing xunit