Wie in this question beschrieben, arbeite ich an einer Methode, die die Elemente von einem List<FileInfo>
, die nicht in einem anderen List<FileInfo>
vorhanden sind, zurückgibt. Ich habe Nawfal-Lösung wie folgt umgesetzt:Warum schlägt dieser CollectionAssert.AreEquivalent() Test fehl?
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;
}
Meine Datensatz für Quelldateien ist:
u:\folder1\a.txt
u:\folder1\b.txt
u:\folder1\c.txt
u:\folder1\d.txt
DestFiles ist:
u:\folder2\a.txt
u:\folder2\b.txt
u:\folder2\c.txt
Wenn ich Schritt durch den Code und untersuchen die Listen 'Werte, dies scheint das erwartete Ergebnis zurückzugeben. Aber die Einheit Test nicht mit dem folgenden Code:
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);
}
Obwohl result
und expectedResult
haben den gleichen Inhalt - beide Listen ein Element mit dem gleichen Dateipfad und gleichen anderen Eigenschaften haben - der Test nicht erfolgreich mit der Meldung : obwohl
CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s)
of <U:\folder1\d.txt>. The actual collection contains 0 occurrence(s).
expectedResult
ein Auftreten U:\folder1\d.txt
hat. Ich dachte, dass das Problem vielleicht darin besteht, dass ich die Speicheradressen für zwei Objekte anstelle des Inhalts dieser Objekte vergleiche, aber ich dachte, die AreEquivalent()
vergleicht Eigenschaften. Ist das nicht der Fall?
EDIT: Basierend auf dem Rat über Eigenschaften anstelle von Adressen zu vergleichen, habe ich dieses Assert statt, die der Test durchgelassen:
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));
}