5

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

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

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

我正在使用 boost.test,我想创建一个单元测试来检查输出数据类型在给定一些输入的情况下是否正确。但是我不知道该怎么做,因为输入没有作为参数传递给函数。

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

4

1 回答 1

8

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

my_struct my_func()
{
    //...

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

    //...
}

然后像这样重写:

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);

    //...
}

这样,您将能够通过将对象my_func传递到.std::istringstreammy_func(std::istream&)

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

于 2011-03-08T00:01:12.717 回答