我有以下代码我正在尝试编写单元测试:
// 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());
}
}
}
现在,我已经模拟了Open()
返回的Stream实例。这很简单。流对象也是MemoryStream
,顺便说一句。
但是我不确定如何设置ReadToEnd()
..来返回我的一些字符串内容。这是因为StreamReader
实例对此方法是私有的。
我想提供一个可以设置的属性。
例如。
public string AStreamReader { get; set; }
然后这样做..
// 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());
}
}
}
然后只是将模拟StreamReader
传递给AStreamReader
属性。
但我真的不想这样做。我觉得我正在泄漏一些内部逻辑,不一定......而且只是为了嘲笑!一个真正的用户永远不会设置它......所以这感觉真的很脏。
请问任何人可以提供一些建议吗?
答案 0 :(得分: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();
}
}
答案 1 :(得分:0)
将修饰符设置为protected,并将其子类化。这就是我们对大多数测试的处理方式,在这种情况下。