1

ストリームがディスクにコピーされたことを確認する単体テストを作成したいと思います。

問題は、CopyTo メソッドが仮想ではないため、使用できないことです

inputMemoryStreamMock.Verify(c => c.CopyTo(outputMemoryStreamMock.Object));

ストリームをモックする方法がわかりません:-/

ここに私のテスト方法があります:

    [TestMethod]
    public void Save_Stream_On_DestinationPath()
    {
        // Arrange
        string fileName = "filename.pdf";
        DateTime date = new DateTime(2013, 9, 27);

        var serverConfigMock = new Mock<IServerConfigurationManager>();
        serverConfigMock.Setup(config => config.ReportingBasePath).Returns(@"c:\reportsFolder");

        var factoryReportFileResultMock = new Mock<IReportFileResultFactory>();

        var timeManagementMock = new Mock<ITimeManagement>();
        timeManagementMock.Setup(c => c.GetServerDate()).Returns(date);

        var fileSystemMock = new Mock<IFileSystem>();
        var fileInfoFactory = new Mock<IFileInfoFactory>();
        var directoryInfoBaseMock = new Mock<DirectoryInfoBase>();
        var inputMemoryStreamMock = new Mock<Stream>();
        var outputMemoryStreamMock = new Mock<Stream>();

        var reportFileHelper = new ReportFileHelper(serverConfigMock.Object, factoryReportFileResultMock.Object, fileSystemMock.Object);


        inputMemoryStreamMock.Setup(c => c.CanRead).Returns(true);
        outputMemoryStreamMock.Setup(c => c.CanWrite).Returns(true);
        outputMemoryStreamMock.Setup(c => c.CanWrite).Returns(true);

        fileSystemMock.Setup(c => c.FileInfo).Returns(fileInfoFactory.Object);
        fileSystemMock.Setup(c => c.File.Create(It.IsAny<string>())).Returns(outputMemoryStreamMock.Object);
        fileSystemMock.Setup(c => c.Directory.CreateDirectory(It.IsAny<string>())).Returns(directoryInfoBaseMock.Object);
        // Act  
        reportFileHelper.Save(inputMemoryStreamMock.Object, fileName, timeManagementMock.Object);

        // Assert
        inputMemoryStreamMock.Verify(c => c.CopyTo(outputMemoryStreamMock.Object));

    }

テストする方法は次のとおりです。

    public void Save(Stream portfolioReportFileInfoBase,  string destinationName, ITimeManagement timeManagement)
    {
        string destinationPath = GetDestinationPath(timeManagement);
        string destinationFileUri = Path.Combine(destinationPath, destinationName);

        FileSystem.Directory.CreateDirectory(destinationPath);

        using (var fileStream = FileSystem.File.Create(destinationFileUri))
        {
            portfolioReportFileInfoBase.CopyTo(fileStream);
        }
    }

ありがとうございました

4

2 に答える 2

1

Moq ではモックできないSaveため、メソッドのコードを変更したくない場合は、TypeMock Isolator や Microsoft Fakes などの分離フレームワークを使用してこのケースをテストする必要があります。CopyTo

の背後にあるファイルシステムへのアクセスはすでにカプセル化されていますIFileSystem。のようなメソッドを追加してみませんCopyStreamToPathか?

public void Save(Stream portfolioReportFileInfoBase,  string destinationName, ITimeManagement timeManagement)
{
    string destinationPath = GetDestinationPath(timeManagement);
    string destinationFileUri = Path.Combine(destinationPath, destinationName);

    FileSystem.Directory.CreateDirectory(destinationPath);
    FileSystem.CopyStreamToPath(portfolioReportFileInfoBase, destinationFileUri);
}

そしてテスト:

fileSystemMock.Verify(c => c.CopyStreamToPath(inputMemoryStreamMock.object, It.IsAny<string>()));
于 2013-10-04T10:53:04.023 に答える