2012-10-24 84 views
4

我想弄清楚一個很好的方式來單元測試我在C++中執行的operator<<。我有一個實現操作符的類,並給出了一個具有特定狀態的實例,我想檢查輸出結果是我想要的。單元測試運算符<< in C++

這是我的代碼(頭文件):現在

class Date { 
    virtual int year() const { return 1970; }; 
    virtual int month() const { return 1; }; 
    virtual int day() const { return 1; }; 
    friend std::ostream &operator<<(std::ostream &os, const Date &d); 
}; 

std::ostream &operator<<(std::ostream &os, const Date &d) { 
    os << d.year() << "-" << d.month() << "-" << d.day(); 
    return os; 
}; 

,在我的單元測試方法,我只是做Date d; cout << d;,當我運行的輸出是正確的測試驗證。但是,我更願意以編程方式驗證這一點,所以我不必在最終報告中看到測試輸出(希望它說「0次測試失敗!」)。

我對C++相當新,所以我從來沒有真正使用過流,除了輸入和輸出。

我該如何做到這一點?

+6

除非需要訪問私人會員,否則不應該讓它成爲朋友。 – chris

+3

[std :: stringstream在標題](http://tipsandtricks.runicsoft.com/Cpp/Stringstream.html) –

+0

@chris:我簡單一點 - 但感謝提醒! –

回答

17

可以使用std::stringstream來保存結果,然後在其上調用str()得到一個字符串:

#include "Date.h" 

#include <iostream> 
#include <sstream> 

int main() { 
    Date d; 
    std::stringstream out; 
    out << d; 
    if(out.str() == "1970-1-1") { 
     std::cout << "Success"; 
    } else { 
     std::cout << "Fail"; 
    } 
} 

注:我花了相當長的一段尋找在C體面的單元測試框架++和我當時發現最好的是googletest - 如果你還沒有選擇框架。

+0

謝謝!這正是我所期待的。我們已經在使用cxxtestgen(一個基於python的框架),我沒有選擇自己,但是目前這已經足夠了。感謝您的提示,但 - 我一定會在下次選擇測試框架時看看googletest! –

+1

@BrendanLong如果你最近沒有看過(在過去的一個月左右),我發佈了一個我相信超越gtest的新的[單元測試框架](https://bitbucket.org/moswald/xunit)。 OTOH,如果你*看過xUnit ++並仍然喜歡gtest,那麼你介意讓我知道爲什麼?我歡迎所有的反饋。 – moswald

+0

@moswald看起來很酷。在下一個需要新測試框架的情況下,我可能會試試這個。我喜歡事實/理論。 –