6

次のコードをテストしようとしています。

public ICollection<RawCatalog> ReadCatalog(string familyName)
{
    // Root folder for the family
    string familyFolder = this.GetFamilyFolder(familyName);
    DirectoryInfo familyFolderInfo = new DirectoryInfo(familyFolder);

    foreach (DirectoryInfo subFamilyFolderInfo in familyFolderInfo.EnumerateDirectories())
    {
        // Do stuff
    }
}

私はこれがうまくいくと思っていました:

// Arrange
DirectoryInfo fakeDirectoryInfo = Mock.Create<DirectoryInfo>(Constructor.Mocked);
Mock.Arrange(() => new DirectoryInfo(@"testRoot\DrivesData\TestFamily")).Returns(fakeDirectoryInfo);
Mock.Arrange(() => directoryInfo.EnumerateDirectories()).Returns(new DirectoryInfo[] { });

しかし、コンストラクターで fakeDirectoryInfo が返されていないように見えるため、機能していません。テストはどのように行えばよいですか?(可能であれば、ソースコードは動作するコードであるため、変更しないでください)。

将来のモックと DoNothing() の使用について読んだことがありますが、これが自分の状況に当てはまるかどうかはわかりません。

前もって感謝します。

4

1 に答える 1

6

今後の参考のために:

残念ながら、コンストラクターのインターセプトで戻り値を配置することはできません。

JustMock.Mock.Arrange(() => new DirectoryInfo(@"testRoot\DrivesData\TestFamily")).Returns(fakeDirectoryInfo);)

インスタンスを区別する必要がない場合は、次のようなものを使用できます。

Mock.Arrange(() => new DirectoryInfo(passedString)).DoNothing();

そして、手配呼び出しで.IgnoreInstance()メソッドを使用します。これにより、次のような呼び出しが発生するはずです。

Mock.Arrange(() => fakeDirectoryInfo.EnumerateDirectories()).IgnoreInstance().Returns(new DirectoryInfo[] { });
于 2014-02-17T19:47:29.743 に答える