【问题标题】:Redirecting Console.Out within test Setup and Teardown在测试设置和拆卸中重定向 Console.Out
【发布时间】:2015-03-25 22:43:32
【问题描述】:

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

我想在测试时使用 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 语句进行重定向? 例如

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

【问题讨论】:

    标签: c# unit-testing console nunit


    【解决方案1】:

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

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

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

    我使用可变状态和Implicit Setup 和 Teardown 的主要问题是它不是线程安全的,所以如果你想并行运行单元测试,你不能。

    【讨论】:

    • 感谢您的及时答复。关于处理对象的第一点,在 Teadown 中调用 _sw.Dispose(); 会有所帮助吗?这会以更确定的方式处理对象吗? using 仍然是首选吗?
    • 关于并行运行测试,在我们设置 Console.SetOut 时这是否仍然有效。在这种情况下,这不是仍然共享可变状态吗?
    • TearDown 中调用_sw.Dispose()_sr.Dispose()可能会有所帮助,但正如我也写的那样,这可能是一个过早的微优化......唯一知道的方法是测量...我不知道Console.SetOut 是否是线程安全的,但如果不是,那么您将永远无法并行运行这些特定的测试。跨度>
    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多