C# 重定向控制台。在测试设置和拆卸中退出
这是Mark Seemann接受的答案中的后续内容 我想使用Console.Out和Console.In在测试时重定向流。类中的每个测试都需要使用重定向 为了保持测试干净,我想在测试设置和拆卸中这样做 我是这么想的:C# 重定向控制台。在测试设置和拆卸中退出,c#,unit-testing,console,nunit,C#,Unit Testing,Console,Nunit,这是Mark Seemann接受的答案中的后续内容 我想使用Console.Out和Console.In在测试时重定向流。类中的每个测试都需要使用重定向 为了保持测试干净,我想在测试设置和拆卸中这样做 我是这么想的: private StringWriter _sw; private StringReader _sr; [SetUp] public void SetUp() { _sw = new StringWriter(); Console.SetOut(_sw);
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()”来验证写入流的内容
为此使用安装或拆卸方法是否有任何主要缺点?
这是否类似于使用语句通过重定向?
例如
为此使用安装或拆卸方法是否有任何主要缺点
是的,尽管它可能无法测量
这里描述了设置
和拆卸
方法,每次测试都会创建两个新的一次性对象,但它们永远不会被丢弃。它们最终将超出范围,并在垃圾收集器运行时最终确定,但它可能以不太确定的方式发生。理论上,它将使用更多的内存和处理器指令,而不是像Knuth 40年前教我们的那样,我们应该进行测量,而不是过早地进行优化
我使用可变状态和拆卸的主要问题是它不是线程安全的,因此,如果您想并行运行单元测试,您就不能。谢谢您的快速回答。关于处理对象的第一点,调用\u sw.Dispose()是否有帮助代码>在下拉菜单中?这会以更确定的方式处理对象吗?是否仍然首选使用
?关于并行运行测试,在我们设置Console.SetOut时,这是否仍然有效。在这个上下文中,这还不是共享的可变状态吗?在拆卸中调用\u sw.Dispose()
和\u sr.Dispose()
可能会有帮助,但正如我所写的,这可能是一个过早的微观优化。。。知道的唯一方法是测量。。。我不知道Console.SetOut
是否是线程安全的,但如果不是,那么您将永远无法并行运行这些特定的测试。
using (StringWriter sw = new StringWriter())
{
...
}