重定向控制台。在测试设置和拆解中

时间:2015-03-25 22:43:32

标签: c# unit-testing console nunit

这是Mark Seemann接受的答案中Grabbing the output sent to Console.Out from within a unit test?referenced article的后续跟进。

我想在测试时使用Console.Out和Console.In来重定向流。该类中的每个测试都需要使用重定向。

为了保持测试清洁,我想在测试SetUp和TearDown中执行此操作。

这就是我的想法:

private StringWriter _sw;
private StringReader _sr;
[SetUp]
public void SetUp()
{
    _sw = new StringWriter();
    Console.SetOut(_sw);
    _sr = new StringReader("100");
    Console.SetIn(_sr);
}

[TearDown]
public void TearDown()
{
    var standardOut = new StreamWriter(Console.OpenStandardOutput());
    standardOut.AutoFlush = true;
    Console.SetOut(standardOut);
    Console.SetIn(new StreamReader(Console.OpenStandardInput()));
 }

然后我会在测试中使用'_sw.ToString()'来验证写入流的内容。

使用设置或拆卸方法有什么主要缺点吗? 这类似于使用using语句重定向吗? E.g。

using (StringWriter sw = new StringWriter())
{
    ...
}

1 个答案:

答案 0 :(得分:2)

  

对此使用设置或拆卸方法有什么主要缺点吗?

是的,虽然可能无法衡量。

此处描述了SetupTearDown方法的方法,为每个测试创建了两个新的一次性对象,但它们从未被丢弃。它们最终会超出范围并在垃圾收集器运行时最终确定,但它可能以较不确定的方式发生。从理论上讲,它将使用更多的内存和处理器指令,而不是确定性处理它们,但正如Knuth 40年前教给我们的那样,我们应该测量而不是过早地进行优化。

使用可变状态和Implicit Setup以及拆解的主要问题是它不是线程安全的,所以如果您想要并行运行单元测试,则无法做到。