【发布时间】:2015-07-29 17:31:35
【问题描述】:
我在 C# 控制台应用程序中测试“控制台输入”和“控制台输出”时遇到问题。
如果我使用 Console.WriteLine 和 Console.ReadLine,我可以使用 NUnit 框架来测试应用程序,但如果我使用辅助类输入并输出到控制台,我无法让它工作。
帮助程序类是 https://open.kattis.com/download/Kattio.cs 并使用 BufferedStream 写入控制台,但我无法让我的测试读取它...
它为“Console in”使用 StreamReader,但我得到一个“NoMoreTokenException”,我猜它没有得到任何输入......
我想使用辅助类,但我无法使用它进行测试...
例如: 测试用例:
[Test]
public void test_hello_world ()
{
using (var sw = new StringWriter ()) {
Console.SetOut (sw);
using (var sr = new StringReader ("Start")) {
Console.SetIn (sr);
MainClass.Main(new string[]{});
string expected = "Hello World!\n";
Assert.AreEqual (sw.ToString (), expected);
}
}
}
例如:有效的代码:
string line = "";
if (Console.ReadLine().Equals("Start"))
line = "Hello World!";
else
line = "No such luck!";
Console.WriteLine (line);
例如:无效的代码:
string line = "";
Scanner sc = new Scanner ();
if (sc.Next ().Equals ("Start"))
line = "Hello World!";
else
line = "No such luck!";
BufferedStdoutWriter outWritter = new BufferedStdoutWriter ();
outWritter.WriteLine (line);
outWritter.Flush ();
有人知道如何解决这个问题吗?
【问题讨论】:
-
如果您查看documentation 中的
Console.OpenStandardInput,它会说此方法可用于在标准输入流被 SetIn 方法更改后重新获取它。我认为这意味着它正在撤消Console.SetIn,因此它实际上是从控制台读取而不是您的StringReader。 -
您可以通过在单独的进程中启动程序并传递输入并从中获取输出来实现这一目标。
标签: c# unit-testing