我正在使用cxxtest作为我的C ++类的测试框架,并且想要找出一种模拟将数据发送到通常期望从标准输入接收它的类的方法。我有几个不同的文件,我想在不同的测试中发送到类,所以从命令行到测试套件可执行文件的重定向不是一个选项。
基本上,我真正想做的是找到一种方法将'stdin'句柄重新定义或重定向到我在程序中创建的其他值,然后使用这些测试中的fwrite()以便相应的类内部的fread()从程序中提取数据,而不是从与可执行文件关联的实际标准I / O句柄中提取数据。
这甚至可能吗?独立于平台的解决方案的奖励积分,但至少,我需要在Windows下使用Visual Studio 9。
答案 0 :(得分:10)
适当的方法是重写您的类,以便它们是可测试的。它们应该接受它们应该从中读取数据的句柄,流或文件作为参数 - 在测试框架中,您可以在流中模拟或提供包含测试数据的文件的路径。
答案 1 :(得分:3)
您应该能够使用freopen()将stdin指向任意文件。
答案 2 :(得分:3)
rdbuf完全符合您的要求。您可以打开一个文件进行读取,并将cin的rdbuf替换为文件中的一个。 (请参阅使用cout的示例链接。)
在类似unix的操作系统上,您可以关闭0文件句柄(stdin)并打开另一个文件。它将具有最低的可用句柄,在这种情况下为0.或者使用其中一个完全相同的posix调用。我不确定,但这也适用于Windows。
答案 3 :(得分:2)
我认为您希望您的类直接使用输入流而不是std::cin
。您需要将输入流传递到类中,或者通过某种方法将其设置在类中。例如,您可以使用stringstream
传递测试输入:
std::istringstream iss("1.0 2 3.1415");
some_class.parse_nums(iss, one, two, pi);
答案 4 :(得分:2)
我们可以重定向cin,以便从文件中读取数据。这是一个例子:
#include <iostream>
#include <fstream>
#include <string>
int main()
{
std::ifstream inputFile("Main.cpp");
std::streambuf *inbuf = std::cin.rdbuf(inputFile.rdbuf());
string str;
// print the content of the file without 'space' characters
while(std::cin >> str)
{
std::cout << str;
}
// restore the initial buffer
std::cin.rdbuf(inbuf);
}