这是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())
{
...
}
答案 0 :(得分:2)
对此使用设置或拆卸方法有什么主要缺点吗?
是的,虽然可能无法衡量。
此处描述了Setup
和TearDown
方法的方法,为每个测试创建了两个新的一次性对象,但它们从未被丢弃。它们最终会超出范围并在垃圾收集器运行时最终确定,但它可能以较不确定的方式发生。从理论上讲,它将使用更多的内存和处理器指令,而不是确定性处理它们,但正如Knuth 40年前教给我们的那样,我们应该测量而不是过早地进行优化。
使用可变状态和Implicit Setup以及拆解的主要问题是它不是线程安全的,所以如果您想要并行运行单元测试,则无法做到。