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

有没有人对如何解决这个问题有任何见解?

在c#中测试控制台进出控制台应用程序

正如@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.