2012-12-26 23 views
5

this questionに記載されているように、別のList<FileInfo>に存在しないList<FileInfo>の要素を返すメソッドに取り組んでいます。次のように私はNawfalのソリューションを実装しました:このCollectionAssert.AreEquivalent()テストが失敗するのはなぜですか?

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; 
} 

、ソースファイルに設定された私のデータは次のとおりです。

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 

私は、コードをステップ実行してリストを調べるとこれは期待される結果を返すようです。両方のリストには、同じファイルパスと同じ他のプロパティを持つ一つの要素を持っている - - テストはメッセージで失敗しresultexpectedResultは、同じ内容を持っているにもかかわらず

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); 
    } 

:しかし、ユニットテストは、次のコードで失敗します:

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の発生を持っています。おそらく問題は、それらのオブジェクトの内容の代わりに2つのオブジェクトのメモリアドレスを比較しているということだと思っていたが、AreEquivalent()がプロパティを比較していると思った。そうじゃないの?

EDIT:プロパティの代わりに、アドレスを比較に関するアドバイスをもとに、私はテストが通過を許可され、代わりにこのアサートを使用:

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)); 
    } 

答えて

7

おそらくFileInfoが参照型と既定の比較だけをチェックしているので、 2つの要素のアドレスが等しくなるようにします。 FileInfoは封印されているので、それから派生して同等の比較元を上書きすることはできません。私の意見では、IEqualityComparerインスタンスをCollectionAssert.AreEquivalentに渡すことができないので、独自のコレクション比較メソッドを作成することをお勧めします。

4

コレクションに異なるオブジェクトが含まれているため、テストに失敗しています。同じファイルを参照するFileInfoクラスのインスタンスが2つあり、instanceA.Equals(instanceB)を呼び出した場合、結果はfalseになります。

FileInfoの代わりに文字列を使用するようにコードを変更できる場合は、期待通りに動作します。

1

私は、ファイル名のあなたの私の意見:)で1

  1. セレクト2集よりも優れている2つのアプローチを提案し、これらのコレクションを比較することができます:

    CollectionAssert.AreEquivalent(
        result.Select(fi => fi.FullName).ToArray(), 
        expectedResult.Select(fi => fi.FullName).ToArray() 
    ); 
    // ToArray() is added just for better output when test fails. 
    
  2. 使用ユーザー定義比較すると比較するFileInfoリスト:

    Assert.That(
        result, 
        Is 
         .EquivalentTo(expectedResult) 
         .Using((Comparison<FileInfo>)((fi1, fi2) => fi1.FullName.CompareTo(fi2.FullName))) 
    ); 
    

2つのforeach文であなたの現在のimplementaionは、以下の場合に失敗することはありません。

result = 
    u:\folder1\a.txt 
    u:\folder1\a.txt 

expectedResult = 
    u:\folder1\a.txt 

ええ、ファイルのリストについては、実際のケースではないようですが、generalyそれがするのは良いアイデアではありませんAreEquivalent()/Is.EquivalentTo()を2つのループに置き換えてください。

関連する問題