我该如何模拟这个.NET代码?

Pur*_*ome 1 .net c# unit-testing mocking stream

我有以下代码我正在尝试编写单元测试:

// Grab all of the content.
var rawContent = new StringBuilder();
foreach (var fileInfo in response.Files)
{
    using (var stream = fileInfo.VirtualFile.Open())
    {
        using (var streamReader = new StreamReader(stream))
        {
            rawContent.Append(streamReader.ReadToEnd());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我已经模拟了Open()返回的Stream实例.这很简单.流对象也是一个MemoryStream顺便说一句.

但我不知道如何设置ReadToEnd()..以返回我的一些字符串内容.这是因为该StreamReader实例对此方法是私有的.

我想提供一个可以设置的属性.

例如.

public string AStreamReader { get; set; }
Run Code Online (Sandbox Code Playgroud)

然后这样做..

// Grab all of the content.
var rawContent = new StringBuilder();
foreach (var fileInfo in response.Files)
{
    using (var stream = fileInfo.VirtualFile.Open())
    {
        using (var streamReader = AStreamReader ?? new StreamReader(stream))
        {
            rawContent.Append(streamReader.ReadToEnd());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后只是StreamReader通过该AStreamReader属性传递模拟.

但我真的不想这样做.我觉得我正在泄漏一些内部逻辑,不一定......而且只是为了嘲笑!一个真正的用户永远不会设置..所以这感觉真的很脏.

请问任何人可以提供一些建议吗?

Ben*_*ter 5

也许我错过了一些东西,但如果你能够嘲笑输入Stream,为什么你需要嘲笑StreamReader

以下不适合您吗?

    private string ReadFromResponseFiles(Stream[] inputs)
    {
        var rawContent = new StringBuilder();
        foreach (var stream in inputs)
        {
            using (stream)
            {
                using (var streamReader = new StreamReader(stream))
                {
                    rawContent.Append(streamReader.ReadToEnd());
                }
            }
        }

        return rawContent.ToString();
    }

    [Test]
    public void Can_read_files()
    {
        var file1 = new MemoryStream(Encoding.UTF8.GetBytes("Foo"));
        var file2 = new MemoryStream(Encoding.UTF8.GetBytes("Bar"));

        var result = ReadFromResponseFiles(new[] { file1, file2 });
        Assert.AreEqual("FooBar", result);

        file1.Dispose();
        file2.Dispose();
    }

}
Run Code Online (Sandbox Code Playgroud)