我有一个从std :: cin读取用户输入的函数,我想编写一个将一些字符串插入到std :: cin中的单元测试,以便稍后从std :: cin中提取将读取该字符串而不是暂停用于键盘输入。
理想情况下,我会更改函数签名,以便我可以将自定义istream作为参数传递,但我不能这样做,因为我有一个我无法更改的固定界面。
cin.putback()几乎我想要的东西,但是它一次只插入一个字符,并且它以相反的顺序插入它们(但是我读到了某个地方放回了char最初并不存在危险,虽然网站没有详细阐述原因)。我已经尝试了几种方法将字符串注入cin的内部缓冲区cin.rdbuf(),但没有一种方法可以正常工作。我也考虑过使用外部测试脚本或创建子进程,但是我想首先考虑用纯C ++进行测试。
那么,是否有任何方法将字符串放入cin?或者你知道更好的方式来注入我的“假键盘输入”吗?
答案 0 :(得分:14)
您可以让您的程序接受一般cin
,而不是使用std::istream&
。正常运行时,只需传递cin
即可。在单元测试期间,将其传递给您自己创建的I / O流。
答案 1 :(得分:9)
如果你真的,真的想使用std :: cin,试试这个:
int main() {
using namespace std;
streambuf *backup;
istringstream oss("testdata");
backup = cin.rdbuf();
cin.rdbuf(oss.rdbuf());
string str;
cin >> str;
cout << "read " << str;
}
从备份完成后,您可以恢复std :: cin的streambuf。 我不保证这个的可移植性; P
答案 2 :(得分:0)
cin.butback()保证最多只能使用一个字符,因此您无法回放整个字符串。使用包裹cin的流并允许任意putback()序列长度。我认为Boost.Iostream有类似的东西,如果没有,那么实现这样的包装可能会有所帮助。