C# 单元测试 StreamWriter 参数

Posted

技术标签:

【中文标题】C# 单元测试 StreamWriter 参数【英文标题】:C# Unit Test a StreamWriter parameter 【发布时间】:2012-09-10 22:14:39 【问题描述】:

我有一堆类都实现了一个接口,其中一个参数是 StreamWriter。

我需要检查 StreamWriter 的内容。

我正在尝试寻找一种方法来避免在测试服务器上写入文本文件并打开它们来检查内容。

有没有办法快速将 StreamWriter 内容/流转换为 StringBuilder 变量?

【问题讨论】:

【参考方案1】:

您无法检查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);
    

【讨论】:

StreamWriter 默认使用 UTF-8,因此应该使用它来获取 actual 这行得通,谢谢。唯一不同的是我在 using 之外声明了实际的字符串 var,并在 using 之外对其进行了测试。【参考方案2】:

如果可能的话,我建议您将参数更改为TextWriter - 此时您可以使用StringWriter

或者,您可以在MemoryStream 周围创建一个StreamWriter,然后稍后测试该MemoryStream 的内容(通过倒回它,或者只是调用ToArray() 以将完整内容作为字节数组获取。如果你真的想测试 text,使用StringWriter 肯定更简单。

【讨论】:

或许能改,但接口正在被其他几个类使用。 @user295734:任何使用的东西仍然可以传入StreamWriter - 但如果你真的只是想要一些东西,你可以写文本到@987654331 @ 几乎可以肯定是一个更好的抽象使用。您应该只需要更改界面的实现 ...我希望它们会很好。 如果我刚开始,我可能会回去进行更改,其他人的代码要更改的地方太多了,所以我没有时间测试他们所有的代码(猜他们应该为他们的代码编写单元测试。)感谢下次提醒。【参考方案3】:

在这种情况下,您需要模拟测试用例。你可以使用像 rhino mocks 这样的框架。 mocking 框架的优点是,可以验证对象的内容,但不必打服务器或占用服务器资源。

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

【讨论】:

为什么你认为在这种情况下需要模拟?如果 OP 想要测试他的代码在错误情况下的行为,那么 Mocking 会有所帮助,但要找出正在编写的内容,则无需使用 mocking。

以上是关于C# 单元测试 StreamWriter 参数的主要内容,如果未能解决你的问题,请参考以下文章

C#:区分 CurrentCulture 和 InvariantCulture 的单元测试

C# 创建一个简单的单元测试实例(MSTest框架)

.NET 单元测试的艺术&单元测试之道C#版

基于C#的单元测试(VS2015)

C# - 单元测试,模拟?

c#单元测试:在单元测试中写入设置不会在user.config中保存值