2008-09-27 79 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); 
} 
相關問題