使用NUnit和Console进行单元测试

时间:2011-07-21 00:53:46

标签: .net unit-testing console nunit pdcurses

我一直在玩curses sharp库(ac#wrapper for pdcurses),编写一些单元测试代码来处理api以及它是如何工作的,我想出了一个问题。 / p>

我可以使用以下代码在DLL中运行curses(以便nUnit可以测试它):

        bool consoleAllocated = AllocConsole();
        if (!consoleAllocated)
            throw new Exception("Unable to allocate a new console.");

        Curses.InitScr();

        Stdscr.Add(4, 6, "This is a test title");

        Curses.EndWin();

        FreeConsole();

AllocConsole和FreeConsole是从kernel32导入的extern。

我想要做的是能够将位置4,6的控制台输出读取到字符串,以便以编程方式检查我输入的字符串是否已正确输出。能够像这样进行检查以便使用TDD创建一个curses风格的应用程序非常重要。

我查看了Curses和Stdscr对象(包括Curses Sharp对象)和Console对象(来自windows库)并且还没有找到方法。有没有人有任何想法?

1 个答案:

答案 0 :(得分:3)

我设法找到答案,如果有人有兴趣,我已经包含了下面的代码。它很乱,因为我还没有把它清理干净,但它应该作为如何做到这一点的一个例子。

感谢pinvoke.net出色的签名收藏。

    [DllImport("kernel32", SetLastError = true)]
    static extern bool AllocConsole();

    [DllImport("kernel32", SetLastError = true)]
    static extern bool FreeConsole();

    [DllImport("kernel32", SetLastError = true)]
    static extern IntPtr GetStdHandle(int nStdHandle);

    [DllImport("kernel32", SetLastError = true)]
    static extern bool ReadConsoleOutputCharacter(IntPtr hConsoleOutput,
        [Out]StringBuilder lpCharacter, uint nLength, COORD dwReadCoord,
        out uint lpNumberOfCharsRead);

    const int STD_OUTPUT_HANDLE = -11;

    [StructLayout(LayoutKind.Sequential)]
    struct COORD
    {
        public short X;
        public short Y;
    }

    [Test]
    public void WriteTitle()
    {
        bool consoleAllocated = AllocConsole();
        if (!consoleAllocated)
            throw new Exception("Unable to allocate a new console.");

        Curses.InitScr();

        Stdscr.Add(4, 6, "This is a test title");
        Stdscr.Refresh();

        IntPtr stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
        uint length = 20;
        StringBuilder consoleOutput = new StringBuilder((int)length);
        COORD readCoord;
        readCoord.X = 6;
        readCoord.Y = 4;
        uint numOfCharsRead = 0;

        ReadConsoleOutputCharacter(stdOut, consoleOutput, length, readCoord, out numOfCharsRead);

        string outputString = consoleOutput.ToString();
        Assert.That(outputString, Is.EqualTo("This is a test title"));

        Curses.EndWin();

        FreeConsole();
    }