在c#中测试控制台进出控制台应用程序
本文关键字:控制台 应用程序 测试 | 更新日期: 2023-09-27 18:05:37
我在c#控制台应用程序中测试"Console in"answers"Console out"时遇到了一个问题。
如果我使用Console。WriteLine和Console。我可以使用NUnit框架来测试应用程序,但是如果我使用辅助类来输入和输出控制台,我就不能让它工作。
helper类是https://open.kattis.com/download/Kattio.cs,并使用BufferedStream写入控制台,但我不能让我的测试读取它…
它使用一个StreamReader的"控制台",但我得到一个"NoMoreTokenException",我猜它没有得到任何输入…
我想使用助手类,但我不能用它测试…
交货:Testcase:
[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将重置输入流。因此,您需要使helper类对控制台流可测试。(仅当您被允许更改实现时)。
首先,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...............
// .....................
}
同时将Buffer输出写入器更改为:
更新 -构造函数将接受其他流。
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 snippet.