2014-01-07 81 views
0

我正在使用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(), ".*"); 
} 

現在,我想成爲確保沒有其他功能的呼叫。

我試圖把myMockedObjectStrictMock結構,並把EXPECT_CALL(...)時報(0),但我得到了相同的模式,首先:在「退出」呼叫似乎阻止所有EXPECT_CALL評估。

任何提示/解決方法? :)

編輯:忘記告訴:執行env。是Windows 7的使用Visual Studio 2008

回答

1

Google Test's wiki解釋這一點:

由於聲明在子進程運行時,任何內存副作用 (如修改變量,釋放內存等),它會導致在父進程中將不會觀察到 。

這包括Google Mock跟蹤死亡測試聲明中的呼叫。簡而言之,Google Mock和死亡測試不會混用。

我的建議是將這些測試分開。使用Google Mock驗證失敗處理程序是否被調用,並使用死亡測試來驗證您的失敗處理程序確實做了它應該做的事情(終止程序,打印指定的輸出等)

+0

我剛剛意識到在我的部分解決方案中,行爲與任何Times(n)調用的行爲相同,其中n> 0。在執行n = 0時觸發唯一的警告,因爲該函數被調用,但不應調用該函數。所以是的,我想你是對的,除了它不會與我的代碼一起工作,因爲跳過斷言是沒有意義的。不管怎麼說,還是要謝謝你。 – ZaX

+0

我自己就遇到了這個問題。雖然OP可能不知道被告知它永遠不會起作用,我當然會這樣做。謝謝!這真的應該被接受爲正確的。 – evadeflow