2017-06-12 10 views
3

這是一個後續行動,我的最後一個問題的工作:GoogleTest框架似乎不是lambda函數(跟進)

Google Test macros seem not to work with Lambda functions

在這種情況下提到的解決方案爲特定的情況下,即lambda中的模板類的構造函數可以包裝在parantheses中,並且構建會成功。我接受了這個答案。但問題仍然存在,GoogleTest框架似乎不適用於Lambda函數。我在文檔中看不到任何內容。

我做下面的測試,

TEST(errorhandlingInterpolator, NOTtoolargeInput) { 
    ASSERT_NO_THROW(throw); 
} 

這將導致測試失敗。好。

然後,我這樣做,

TEST(errorhandlingInterpolator, NOTtoolargeInput) { 
     ASSERT_NO_THROW([](){throw;}); 
} 

這將導致測試不許失敗。奇怪。所以,最後要徹底地講一些(如此微不足道的),我測試了以下幾點。

void dummy() { throw; } 

TEST(errorhandlingInterpolator, NOTtoolargeInput) { 
     ASSERT_NO_THROW(throw); 
} 

並且異常導致測試失敗。都好。

這引發了我的頭腦中的一面旗幟,即使是使用lambda函數也不例外。我認爲他們就像普通的功能一樣,除了匿名。顯然他們這樣做。以下兩個問題談論這一點。

Can C++ lambda-expression throw?

throw an exception from a lambda expression, bad habit?

所以,它確實似乎歸結爲一個事實,即在谷歌測試框架的宏不與拉姆達職能的工作。

回答

3

ASSERT_NO_THROW([](){throw;})中的表達式不執行異常,它只是聲明一個lambda,然後丟棄它,因爲它沒有分配給任何東西。

你想要ASSERT_NO_THROW([](){throw;}()),立即嘗試執行lambda。

+0

我想哭。我不太瞭解我的lambda表達式,我開始講述一些與我無關的東西。 :'( –

+0

yup!似乎合法,這是問題所在,謝謝! –