c# - 为什么此 CollectionAssert.AreEquivalent() 测试失败?

标签 c# linq unit-testing

this question 中所述,我正在研究一种从 List<FileInfo> 返回元素的方法不存在于另一个 List<FileInfo> .我已经按如下方式实现了 Nawfal 的解决方案:

public List<FileInfo> SourceNotInDest(List<FileInfo> SourceFiles, List<FileInfo> DestFiles)
{
 var notInDest = SourceFiles.Where(c => !DestFiles.Any(p => p.Name == c.Name)).ToList();
 return notInDest;
}

我的 SourceFiles 数据集是:

u:\folder1\a.txt
u:\folder1\b.txt
u:\folder1\c.txt
u:\folder1\d.txt

DestFiles 是:

u:\folder2\a.txt
u:\folder2\b.txt
u:\folder2\c.txt

当我单步执行代码并检查列表的值时,这似乎返回了预期的结果。但是单元测试失败,代码如下:

public void SourceNotInDestTest()
    {
        //arrange
        FileListComparer flc = new FileListComparer(); //class that has the list compare method
        FolderReader fr = new FolderReader(); //class for getting FileInfo from folder
        List<FileInfo> expectedResult = new List<FileInfo>();
        expectedResult.Add(new FileInfo(@"U:\folder1\d.txt"));
        List<FileInfo> SourceFiles = fr.fileList(@"U:\folder1");  //gets the FileInfo for each file in the folder
        List<FileInfo> DestFiles = fr.fileList(@"U:\folder2");


        //act
        List<FileInfo> result = flc.SourceNotInDest(FTPFiles, LocalFiles);

        //assert
        CollectionAssert.AreEquivalent(result, expectedResult);
    }

尽管resultexpectedResult具有相同的内容——两个列表的一个元素具有相同的文件路径和相同的其他属性——测试失败并显示消息:

CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s)
of <U:\folder1\d.txt>. The actual collection contains 0 occurrence(s).

expectedResult确实出现了 U:\folder1\d.txt , 尽管。我在想也许问题在于我正在比较两个对象的内存地址而不是这些对象的内容,但我认为 AreEquivalent()正在比较属性。不是这样吗?

编辑:根据关于比较属性而不是地址的建议,我改为使用这个断言,这允许测试通过:

foreach (FileInfo fi1 in result)
    {
     Assert.IsNotNull(expectedResult.Find(fi2 => fi2.FullName == fi1.FullName));
    }
foreach (FileInfo fi1 in expectedResult)
    {
     Assert.IsNotNull(result.Find(fi2 => fi2.FullName == fi1.FullName));
    }

最佳答案

可能是因为 FileInfo 是引用类型,默认比较器只检查两个元素的地址是否相等。由于 FileInfo 是密封的,您不能从中派生并覆盖相等比较器。在我看来,最好的选择是编写您自己的集合比较器方法(因为您不能将 IEqualityComparer 实例传递给 CollectionAssert.AreEquivalent)。

关于c# - 为什么此 CollectionAssert.AreEquivalent() 测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14047147/

相关文章:

c# - LINQ 的 WHERE 子句,其中 COLUMN 可能为空

ruby - 如何测试 Sidekiq 作业失败?

java - 如何在 Mockito 中多次 stub 异常

c# - 使用 Unity 填充集合的方法

c# - 在 LINQ 的 where 子句中使用 .NET 字符串函数

c# - 使用联锁用法

c# - 创建参数等于对象的 LINQ 表达式

java - 包含测试失败 Java 的列表

c# - 在不登录的情况下获取 Intranet 上 Web 应用程序的域\用户名

c# - 单击图片框的不同部分 (c#)