我正在使用gtest和gmock編寫測試。我的大多數測試用例都會被自定義斷言(我嘲笑)崩潰。 這裏來的麻煩:而斷言很好地觸發,我有預期的電話很多問題。在死亡測試中錯誤的函數調用評估
下面的代碼是三個步驟我在以使其工作已通過('的原因是,這部分作品):
class MyTestedObject : public testing::Test {
public:
static MockObject * myMockedObject;
};
void assertFailure() {
exit(1);
}
TEST_F(MyTestedObjectDeathTest, nullInputConstructors) {
MockAssertHandler assertHandler;
EXPECT_CALL(assertHandler, failure(_,_,_,_))
.Times(1)
.WillRepeatedly(InvokeWithoutArgs(assertFailure));
setHandler(assertHandler);
testing::Mock::AllowLeak(myMockedObject);
testing::Mock::AllowLeak(&assertHandler);
EXPECT_DEATH(new MyTestedObject(NULL, NULL,0), ".*");
}
MyTestedObject的構造開始檢查參數是否空值。如果至少有一個是,它應該觸發一個斷言。但是測試失敗,因爲失敗是'從不叫'。調試顯示它被調用。
然後我試着評論時間部分,只是爲了確保它來自這裏,這是唯一的問題。它有效,但不夠:我想確定程序因我的斷言而死。作爲EXPECT_CALL的評價,當mock對象銷燬時做的,我猜退出調用被搞亂了整個事情,所以我想這一點,它的工作原理:
void testHelper() {
MockAssertHandler assertHandler;
EXPECT_CALL(assertHandler, failure(_,_,_,_))
.Times(1)
.WillRepeatedly(InvokeWithoutArgs(assertFailure));
setHandler(assertHandler);
testing::Mock::AllowLeak(MyTestedObjectTest::myMockObject);
testing::Mock::AllowLeak(&assertHandler);
new MyTestedObject(NULL, NULL,0);
}
TEST_F(MyTestedObjectDeathTest, nullInputConstructors) {
EXPECT_DEATH(testHelper(), ".*");
}
現在,我想成爲確保沒有其他功能的呼叫。
我試圖把myMockedObject在StrictMock結構,並把EXPECT_CALL(...)時報(0),但我得到了相同的模式,首先:在「退出」呼叫似乎阻止所有EXPECT_CALL評估。
任何提示/解決方法? :)
編輯:忘記告訴:執行env。是Windows 7的使用Visual Studio 2008
我剛剛意識到在我的部分解決方案中,行爲與任何Times(n)調用的行爲相同,其中n> 0。在執行n = 0時觸發唯一的警告,因爲該函數被調用,但不應調用該函數。所以是的,我想你是對的,除了它不會與我的代碼一起工作,因爲跳過斷言是沒有意義的。不管怎麼說,還是要謝謝你。 – ZaX
我自己就遇到了這個問題。雖然OP可能不知道被告知它永遠不會起作用,我當然會這樣做。謝謝!這真的應該被接受爲正確的。 – evadeflow