为用户输入功能提升测试用例

oad*_*ams 5 c++ boost-test

我有一个函数,通过std :: cin接受用户输入:

std::getline(std::cin, in);
Run Code Online (Sandbox Code Playgroud)

并通过将其与正则表达式匹配来创建相应的数据结构.然后该函数返回此数据结构.

我正在使用boost.test,我想创建一个单元测试来检查输出数据类型是否正确给定一些输入.但是我不知道如何去做,因为输入不作为参数传递给函数.

编辑:有没有一种简单的方法来创建一个通过标准输入为函数提供函数的boost测试用例?

Dan*_*ien 7

如果您可以访问调用函数的源代码std::getline,那么最简单的解决方案是将其重写为具有相同签名和实现的另一个函数的包装,但是使用另外一个std::istream&参数代替std::cin.例如,如果您目前有:

my_struct my_func()
{
    //...

    std::getline(std::cin, in);

    //...
}
Run Code Online (Sandbox Code Playgroud)

然后像这样重写:

my_struct my_func(std::istream& is);

inline my_struct my_func()
{
    return my_func(std::cin);
}

my_struct my_func(std::istream& is)
{
    //...

    std::getline(is, in);

    //...
}
Run Code Online (Sandbox Code Playgroud)

这样,您就可以my_func通过将std::istringstream对象传入来测试构造的输入序列的核心功能my_func(std::istream&).

如果您无法访问调用函数的源代码std::getline,那么您可以使用的一个技巧是替换描述符中的标准.有关替换标准输出描述符并相应修改的代码,请参阅此答案.