2015-04-23 97 views
3

我正在使用谷歌測試爲迭代器編寫一些容器類的單元測試。我想創建一個測試,確保我const_iterator是正確const:即,我不能給它分配用googletest測試const行爲

MyContainer<MyType>::const_iterator cItr = MyContainerInstance.cbegin(); 
*cItr = MyType(); // this should fail. 

顯然,這將無法編譯(IFF它的編碼正確),但有一些使用谷歌測試在單元測試中留下這種檢查的方法?或者沒有谷歌測試的某種方式,不需要集成另一個庫?

+0

你可以使用C++ 11嗎?您可能需要查看[type_traits](http://www.cplusplus.com/reference/type_traits/is_const/)。 – huu

回答

3

所以有可能檢測迭代器是否是一個常量迭代器,但它比我最初想象的更復雜。

請記住,你並不需要你不斷迭代的實際情況,因爲所有你正在做的是類型檢查:

// Include <type_traits> somewhere 

typedef MyContainer<MyType>::const_iterator it; 
typedef std::iterator_traits<it>::pointer ptr; 
typedef std::remove_pointer<ptr>::type iterator_type; 
std::cout << std::boolalpha << std::is_const<iterator_type>::value; 
// This'll print a 0 or 1 indicating if your iterator is const or not. 

然後你就可以在GTEST通常的方式檢查搭配:

EXPECT_TRUE(std::is_const<iterator_type>::value); 

免費諮詢:我認爲這是最好只寫一個測試,將無法編譯,如果它違背const正確性,讓你的編譯器檢查這個給你。

你可以用std::vector測試:

typedef std::vector<int>::const_iterator c_it; 
typedef std::iterator_traits<c_it>::pointer c_ptr; 
typedef std::remove_pointer<c_ptr>::type c_iterator_type; 
EXPECT_TRUE(std::is_const<c_iterator_type>::value); 

typedef std::vector<int>::iterator it; 
typedef std::iterator_traits<it>::pointer ptr; 
typedef std::remove_pointer<ptr>::type iterator_type; 
EXPECT_FALSE(std::is_const<iterator_type>::value); 

這應該編譯和通過。

+0

我發現的最簡單的方法是將'remove_reference'和'decltype'這樣一個實例:'EXPECT_TRUE(std :: is_const :: type> :: value);' –

+0

我很欣賞這個建議,它有點複雜。然而,我總是很驚訝,如何支持'const_iterator'比我想象的更難,而且我測試這個常量的次數太多了,評論了測試,然後又重新提出了這個問題:P –

+2

這很有效,重新測試一個單獨的東西。你正在測試函數'cbegin'的返回類型。如果你只是想檢查你聲明的迭代器類型是否正確,那麼我認爲我已經足夠了。儘管如此,這些都是單元測試,爲什麼不呢? :P – huu

相關問題