Модульное тестирование с NUnit и Консолью - PullRequest
1 голос
/ 21 июля 2011

Я поиграл с библиотекой curses sharp (ac # wrapper для pdcurses), написал некоторый код модульного теста, чтобы получить представление о API и о том, как он работает, и у меня возник вопрос.

Я могу выполнять проклятия резко изнутри DLL (чтобы 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 импортируются из extern из kernel32.1007 * Что я хотел бы сделать, так это уметь читать вывод консоли с позиции 4,6 в строку, чтобы программно проверить, правильно ли была введена введенная мной строка.Было бы очень важно иметь возможность выполнять такие проверки, чтобы создать приложение в стиле curses, например, с использованием TDD.

Я просмотрел объекты Curses и Stdscr (оба объекта Curses Sharp),и объект Console (из библиотеки windows) и пока не смогли найти способ.У кого-нибудь есть идеи?

1 Ответ

3 голосов
/ 21 июля 2011

Мне удалось найти ответ, на случай, если кому-то будет интересно, я включил код ниже.Это грязно, поскольку я еще не убрал это, но это должно служить примером того, как это сделать.

Спасибо 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();
    }
...