Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 重定向控制台。在测试设置和拆卸中退出_C#_Unit Testing_Console_Nunit - Fatal编程技术网

C# 重定向控制台。在测试设置和拆卸中退出

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);

这是Mark Seemann接受的答案中的后续内容

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

为了保持测试干净,我想在测试设置和拆卸中这样做

我是这么想的:

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())
{
    ...
}