2011-03-07 57 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