2017-05-04 51 views
1

我有兩個嘲笑。只有其中一個應該被要求單次運行,並且我希望使用期望來確定​​函數是否成功,而不知道給定的先決條件。
這是如何實現的?谷歌模擬expect_call退休另一個期望

Mock1 successMock; 
Mock2 failMock; 

EXPECT_CALL(successMock, performOnSuccess()).Times(1); 
EXPECT_CALL(failMock, performOnFail()).Times(0); 
execute(successMock, failMock); 

上述內容應該是有效的或低於預期,但只有其中之一。

EXPECT_CALL(successMock, performOnSuccess()).Times(0); 
EXPECT_CALL(failMock, performOnFail()).Times(1); 
+0

我無法很好地理解你的情況。你能再詳細一點嗎?這些預期來自兩個不同的測試用例嗎? 對於我所瞭解的,你不確定當你調用'execute'時會發生什麼,我不認爲這是模擬的用例... –

+1

我希望這兩個期望集有效在相同的測試案例中,但只有你說我不確定執行的結果是什麼,但我知道只有一個模擬應該被調用 –

回答

1

你所期望的合作者一個(也是唯一一個)被調用。

一個可行的解決方案(如other languages中所示)是使這些模擬爲在測試範圍內增加共享計數器

您可以通過GoogleMock通過defining actions實現此目的。它會是這樣的:

SuccessMock successMock; 
FailMock failMock; 

int callCounter = 0; 


ON_CALL(successMock, performOnSuccess()) 
    .WillByDefault(InvokeWithoutArgs([&]() 
       { 
        callCounter++; 
       }); 

ON_CALL(failMock, performOnFailure()) 
    .WillByDefault(InvokeWithoutArgs([&]() 
       { 
        callsCounter++; 
       }); 


execute(successMock, failMock); 

ASSERT_THAT(callsCounter, Eq(1)); 

說了這個,這個測試有一些隨機性,我不太喜歡。你最終應該有一個測試期望失敗,另一個測試期望成功。

我爲此寫了一個簡化的gist