接受用户输入的函数的 boost 测试用例

发布于 2024-10-20 12:37:22 字数 274 浏览 6 评论 0原文

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

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

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

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

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

I have a function that takes in user input via std::cin:

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

and creates a corresponding data structure by matching it with a regular expression. The function then returns this data structure.

I'm using boost.test and I want to create a unit test to check that the output data type is correct given some inputs. However I don't know how to go about it since the input isn't passed as an argument to the function.

EDIT: Is there a simple way to create a boost test case that feeds the function a string via standard input?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瀟灑尐姊 2024-10-27 12:37:22

如果您有权访问调用 std::getline 的函数的源代码,那么最简单的解决方案是将其重写为具有相同签名和实现的另一个函数的包装器,但需要额外的用于代替 std::cinstd::istream& 参数。例如,如果您当前有:

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

    //...
}

这样,您将能够通过传递 std::istringstream 在构建的输入序列上测试 my_func 的核心功能> 对象放入 my_func(std::istream&)

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

If you have access to the source code of the function that calls std::getline, then the easiest solution is to rewrite it as a wrapper of another function having the same signature and implementation, but taking an additional std::istream& parameter that is used in place of std::cin. For example, if you currently have:

my_struct my_func()
{
    //...

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

    //...
}

Then rewrite like this:

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

    //...
}

This way, you will be able to test the core functionality of my_func on constructed input sequences by passing std::istringstream objects into my_func(std::istream&).

If you do not have access to the source code of the function that calls std::getline, then one trick that you can use is to replace the standard in descriptor. See this answer for code that replaces the standard out descriptor and modify accordingly.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文