sig*_*gil 5 c# linq unit-testing
正如在这个问题中所描述的那样,我正在研究一种方法,该方法从一个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;
}
Run Code Online (Sandbox Code Playgroud)
我为SourceFiles设置的数据是:
u:\folder1\a.txt
u:\folder1\b.txt
u:\folder1\c.txt
u:\folder1\d.txt
Run Code Online (Sandbox Code Playgroud)
DestFiles是:
u:\folder2\a.txt
u:\folder2\b.txt
u:\folder2\c.txt
Run Code Online (Sandbox Code Playgroud)
当我单步执行代码并检查列表的值时,这似乎返回预期的结果.但单元测试失败,代码如下:
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);
}
Run Code Online (Sandbox Code Playgroud)
尽管result并且expectedResult具有相同的内容 - 两个列表都有一个具有相同文件路径和相同其他属性的元素 - 但测试失败并显示以下消息:
CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s)
of <U:\folder1\d.txt>. The actual collection contains 0 occurrence(s).
Run Code Online (Sandbox Code Playgroud)
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));
}
Run Code Online (Sandbox Code Playgroud)
可能因为FileInfo是引用类型而默认比较器只是检查两个元素的地址是否相等.由于FileInfo是密封的,因此无法从中获取并覆盖相等比较器.在我看来,最好的选择是编写自己的集合比较器方法(因为你无法传递IEqualityComparer实例CollectionAssert.AreEquivalent).
| 归档时间: |
|
| 查看次数: |
1362 次 |
| 最近记录: |