Như được mô tả trong this question, tôi đang làm việc trên phương thức trả về các phần tử từ một số List<FileInfo>
không có trong một số List<FileInfo>
khác. Tôi đã thực hiện giải pháp Nawfal như sau:Tại sao kiểm tra CollectionAssert.AreEquivalent() này lại thất bại?
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;
}
bộ dữ liệu của tôi cho SourceFiles là:
u:\folder1\a.txt
u:\folder1\b.txt
u:\folder1\c.txt
u:\folder1\d.txt
DestFiles là:
u:\folder2\a.txt
u:\folder2\b.txt
u:\folder2\c.txt
Khi tôi bước qua mã và kiểm tra danh sách 'giá trị, điều này dường như trả về kết quả mong đợi. Tuy nhiên, kiểm tra đơn vị không thành công với đoạn mã sau:
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);
}
Mặc dù result
và expectedResult
có các nội dung tương tự - cả hai danh sách có một phần tử với các đường dẫn tập tin tương tự và cùng các tài sản khác - những thử nghiệm thất bại với thông điệp :
CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s)
of <U:\folder1\d.txt>. The actual collection contains 0 occurrence(s).
expectedResult
có sự xuất hiện của U:\folder1\d.txt
. Tôi đã suy nghĩ có lẽ vấn đề là tôi đang so sánh các địa chỉ bộ nhớ cho hai đối tượng thay vì nội dung của các đối tượng đó, nhưng tôi nghĩ rằng AreEquivalent()
đã so sánh các thuộc tính. đây không phải là trường hợp à?
EDIT: Dựa trên những lời khuyên về cách so sánh các thuộc tính thay vì địa chỉ, tôi đã sử dụng Khẳng định này thay vào đó, cho phép các thử nghiệm để vượt qua:
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));
}