我在 C# 控制台应用程序中测试“控制台输入”和“控制台输出”时遇到问题。
如果我使用 Console.WriteLine 和 Console.ReadLine,我可以使用 NUnit 框架来测试应用程序,但是如果我使用辅助类输入和输出到控制台,我就无法让它工作。
辅助类是 https://open.kattis.com/download/Kattio.cs并使用 BufferedStream 写入控制台,但我无法让我的测试读取它...
它使用 StreamReader 作为“Console in”,但我得到一个“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 ();
有人知道如何解决这个问题吗?
最佳答案
正如@juharr 在评论中提到的,调用 Console.OpenStandardInput 将重置输入流。因此,您需要使帮助程序类可针对控制台流进行测试。 (仅当您被允许更改实现时)。
首先可以更新 Tokenizer 类以使用控制台阅读器作为默认 TextReader:
public class Tokenizer
{
string[] tokens = new string[0];
private int pos;
// StreamReader reader; Changed to TextReader
TextReader reader;
public Tokenizer(Stream inStream)
{
var bs = new BufferedStream(inStream);
reader = new StreamReader(bs);
}
public Tokenizer()
{
// Add a default initializer as Console Input stream reader.
reader = Console.In;
}
// ...... Rest of the code goe here...............
// .....................
}
还将缓冲区输出编写器更改为以下内容:
Updated - Constructor will accept other streams as well.
public class BufferedStdoutWriter
{
public TextWriter Writer;
public BufferedStdoutWriter()
{
// Use default writer as console output writer
this.Writer = Console.Out;
}
public BufferedStdoutWriter(Stream stream)
{
Writer = new StreamWriter(new BufferedStream(stream));
}
public void Flush()
{
Writer.Flush();
}
public void Write<T>(T value)
{
Writer.Write(value);
}
public void WriteLine<T>(T value)
{
Writer.WriteLine(value);
}
}
如果需要,同样可以实现更多的功能。
现在您的测试将成功通过 EX: Code that don't work 片段。
关于c# - 在 C# 中测试控制台输入和输出控制台应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31707302/