如何从Unit Test项目模拟用户对控制台应用程序的输入?

时间:2018-01-22 23:26:25

标签: c++ unit-testing winapi input rpn

我正在尝试用C ++编写文本处理控制台应用程序,并且我第一次遇到了Windows API。但是在定义语法或使用现有的bison / flex或boost工具之前,我想实现TDD方法并编写所有测试和接口(除了这里我已经进行了虚拟测试,即使从测试代码启动.exe也很难) 。

我的设计如下: - 来自本机测试项目的单元测试从Windows API调用CreateProcess()函数,我已将其放入CreateProc()宏。此宏的示例(我稍微修改过它)取自MSDN。这个宏的想法是执行我的控制台应用程序,但从单元测试后模拟用户输入。这是代码:

#define MYEXE L"my_Console_Application_Path.exe"
#ifdef MYEXE
PROCESS_INFORMATION CreateProc() {
STARTUPINFO si = { 0 };
PROCESS_INFORMATION pi = { 0 };

ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (CreateProcess
    (
        MYEXE,
        NULL,
        NULL,          
        NULL,          
        NULL, //,         
        CREATE_NEW_CONSOLE,          
        NULL,         
        NULL,          
        &si,            
        &pi            
    ) 
    ) 
    {
        CloseHandle(pi.hThread);
        CloseHandle(pi.hProcess);
        return pi; 
    } 
else 
    {
        std::cout << "Unable to execute.";
        return pi;
    }


}
#endif

测试运行和&#34;使用&#34;我的控制台应用程序已定义:

TEST_CLASS(UnitTest1)
{
public:

    TEST_METHOD(Should_Open_Console)
    {
        PROCESS_INFORMATION processInfo = CreateProc();
        Assert::IsTrue(processInfo.dwProcessId); // check if process id is not zero
    }
控制台应用程序的

main功能如下所示:

int main()
{
    std::cout << "test that function is running" << std::endl;
    std::string myline = "";
    std::getline(std::cin, myline); 
    return 0;
}

基本上我的CreateProc()成功启动了可执行文件。但是,我希望测试模拟main正在使用getline(...)监听的用户输入。在我用一些解析器解析这个序列之后。

如何在当前控制台进程中模拟此输入?当然,如果你能告诉我一些具体的工具(this SendInput() solution是模拟输入的最佳方法吗?),最重要的 - 如何在设计方面做到这一点,我将不胜感激。理想情况下,我在单元测试中看到一个字符串,并通过CreateProcess()作为参数传递给main,同一个字符串以某种方式从控制台读取。有点:

TEST_CLASS(UnitTest1)
{
public:
// parsing Hola as Hello
    TEST_METHOD(Should_Return_Hello_If_Input_Equals_to_Hola)
    {
        CreateProc("Hola");
        Assert::AreEqual(Console.readline() = "Hello"); // dummy code
    }

我是对的吗?如果是的话,我怎么能真正做到这一点? (如果你能纠正代码片段就会很棒)

0 个答案:

没有答案