如此问题所述,我正在开发一个方法,返回一个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);
}
尽管result
和expectedResult
具有相同的内容——两个列表都有一个元素,具有相同的文件路径和其他属性——但测试失败并显示以下消息:
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()
正在比较属性。那不是这种情况吗?
编辑:根据比较属性而不是地址的建议,我使用了这个Assert来代替,这样测试就可以通过了:
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));
}