2008-09-27 72 views
4

我正在使用cxxtest作为我的C++类的测试框架,并且想要找出一种方法来模拟将数据发送到通常期望从标准输入接收它的类。我有几个不同的文件,我想在不同的测试期间发送给类,所以从命令行到测试套件可执行文件的重定向不是一个选项。如何将数据重定向到单个可执行文件中的stdin?

基本上,我真正想要做的是找到一种方法来重新定义或重定向'stdin'句柄到我在我的程序中创建的一些其他值,然后从这些测试中使用fwrite()类内的相应fread()从程序内部拉取数据,而不是从与可执行文件关联的实际标准I/O句柄中提取数据。

这甚至可能吗?独立平台解决方案的附加点,但最低限度,我需要在Windows下使用Visual Studio 9。

回答

10

适当的方法是重写你的类,使它们是可测试的。它们应该接受它们应该从中读取数据的句柄,流或文件作为参数 - 在测试框架中,您可以在流中进行模拟或为包含测试数据的文件提供路径。

3

您应该可以使用freopen()将stdin指向任意文件。

2

我想你想让你的课程直接使用输入流而不是std::cin。你需要将输入流传递到类中,或者通过某种方法将其设置在它们上面。你可以,〔实施例,使用stringstream在您的测试输入传:


std::istringstream iss("1.0 2 3.1415"); 
some_class.parse_nums(iss, one, two, pi); 
3

rdbuf不正是你想要的。你可以打开一个文件读取并用文件中的文件替换cin的rdbuf。 (请参阅使用cout的示例的链接)。

在类似unix的操作系统上,您可以关闭0文件句柄(stdin)并打开另一个文件。它将具有最低可用句柄,在这种情况下它将为0.或者使用其中一个posix调用来完成此操作。我不确定,但这可能也适用于Windows。

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); 
} 
相关问题