我正在尝试用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
}
我是对的吗?如果是的话,我怎么能真正做到这一点? (如果你能纠正代码片段就会很棒)