2012-09-18 31 views
7

我有一堆类都实现一个接口,其中一个参数是一个StreamWriter。C#单元测试StreamWriter参数

我需要检查StreamWriter的内容。

我试图找到一种避免在测试服务器上编写文本文件并打开它们以检查内容的方法。

是否有快速将StreamWriter内容/流转换为StringBuilder变量的方法?

回答

11

您不能检查StreamWriter。您可以检查它正在写入的基础流。所以你可以在你的单元测试中使用MemoryStream,并将其指向StreamWriter。一旦它写完,你可以从中读取。

[TestMethod] 
public void SomeMethod_Should_Write_Some_Expected_Output() 
{ 
    // arrange 
    using (var stream = new MemoryStream()) 
    using (var writer = new StreamWriter(stream)) 
    { 
     // act 
     sut.SomeMethod(writer); 

     // assert 
     string actual = Encoding.UTF8.GetString(stream.ToArray()); 
     Assert.AreEqual("some expected output", actual); 
    } 
} 
+1

'StreamWriter'默认使用UTF-8,所以这是应该被用来获取'actual'。 –

+0

好的@Jon,一如既往。 –

+0

这工作,谢谢。唯一不同的是我在使用之外声明了实际的字符串var,并在使用之外对其进行了测试。 –

9

我会建议您将参数更改为TextWriter如果在所有可能的 - 此时,你可以使用一个StringWriter

或者,你可以创建一个StreamWriter一个MemoryStream左右,然后测试MemoryStream后的内容(通过倒带,或者只是打电话ToArray(),以获得完整内容的字节数组。如果你真的想成为测试文本不过,这绝对是简单的使用StringWriter

+0

也许能够改变它,但接口正在被其他几个类使用。 –

+3

@ user295734:任何使用*的东西仍然可以传入“StreamWriter” - 但如果您真的只想要一些可以写入文本的东西,那么'TextWriter'几乎肯定是一个更好的抽象。你应该只需要改变接口的*实现*,我希望它们可以很好。 –

+0

如果我开始新鲜的话,我可能会回头进行更改,但其他人的代码和更改只是为了更改,我没有时间来测试他们的所有代码(猜测他们应该为他们的代码。)感谢下次提醒。 –

2

您可以写入到一个MemoryStream一个StreamWriter更换。

1

在您需要模拟测试案例这种情况下,你可以使用框架喜欢犀牛嘲笑。嘲笑框架的优势是,您可以验证对象的内容,但不必访问服务器或占用服务器资源。

此链接将为您提供基本的例子:http://www.codeproject.com/Articles/10719/Introducing-Rhino-Mocks

+2

为什么你认为在这种情况下需要嘲笑?如果OP想要测试他的代码在错误情况下的表现如何,嘲笑会有所帮助,但只要找出正在写入的内容,就不需要使用模拟。 –

+1

我们在单元测试中使用Moq。 –