2011-03-07 54 views
5

我有一个功能,通过给std :: cin取入的用户输入:升压测试用例函数取用户输入

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

,并通过与一个正则表达式匹配它创建一个相应的数据结构。该函数然后返回这个数据结构。

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

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

回答

7

如果你有机会获得调用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::istringstream物体进入my_func(std::istream&)

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

+0

可能是一个愚蠢的问题,但包装类应与wrappee类具有不同的名称? – oadams 2011-03-08 01:11:54

+1

@oadams:我认为你的意思是包装*功能*和包装*功能*,正确的? C++支持[函数重载](http://msdn.microsoft.com/en-us/library/5dhe1hce%28VS.80%29.aspx),所以可以有多个名为'my_func'的函数。 – 2011-03-08 01:52:29

+0

哦,好的。是的,功能 - 哎呀。 – oadams 2011-03-08 02:09:00