Come descritto in this question, sto lavorando a un metodo che restituisce gli elementi da uno List<FileInfo>
non presenti in un altro List<FileInfo>
. Ho implementato la soluzione di Nawfal come segue:Perché questo test CollectionAssert.AreEquivalent() fallisce?
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;
}
Il mio set di dati per 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
Quando faccio un passo attraverso il codice ed esaminare le liste 'valori, questo sembra restituire il risultato atteso. Ma il test di unità non riesce con il seguente codice:
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);
}
Anche se result
e expectedResult
hanno gli stessi contenuti - entrambe le liste hanno un elemento con lo stesso percorso del file e altre proprietà stesse - la prova non riesce con il messaggio :
CollectionAssert.AreEquivalent failed. The expected collection contains 1 occurrence(s)
of <U:\folder1\d.txt>. The actual collection contains 0 occurrence(s).
expectedResult
ha un'occorrenza di U:\folder1\d.txt
, però. Stavo pensando che forse il problema è che sto confrontando gli indirizzi di memoria per due oggetti invece del contenuto di quegli oggetti, ma ho pensato che il AreEquivalent()
stesse confrontando le proprietà. Non è questo il caso?
EDIT: Sulla base del parere sul confronto proprietà invece di indirizzi, ho usato questa asserzione, invece, che ha permesso la prova da superare:
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));
}