2017-03-10 62 views
1

有人知道如何編程google模擬方法來重複執行一系列操作(一次一個),當我們事先不知道調用方法的次數時?Google Mock:按指定順序執行重複動作

something like : 
EXPECT_CALL(mock, foo()) 
    .WillRepeatedly(.WillOnce(Return(2)); 
        .WillOnce(Return(40)); 
        .WillOnce(Return(7))); 

行爲:

mock.foo(); // return 2 
mock.foo(); // return 40 
mock.foo(); // return 7 

mock.foo(); // return 2 
mock.foo(); // return 40 
mock.foo(); // return 7 

mock.foo(); // return 2 
... 

感謝

+0

單元的想法測試是您事先知道預期在測試代碼中會發生什麼。所以你的問題對UT來說不是有效的問題。 – PiotrNycz

+0

換句話說 - 你應該爲這個序列發生一次的情況編寫測試,當這個序列發生兩次時,其他測試用例等等。 – PiotrNycz

回答

0

我已經提到在評論認爲,這是不是真的編寫單元測試,你不能有關於什麼是真正發生的事情完全控制或知識,好主意那裏。

但無論如何這是可行的 - 例如,你可以調用拉姆達每個被調用時,會產生一個結果:如果你需要檢查這是不是在序列的中間結束

auto valueGenerator = [idx=0, arr={2,40,7}]() mutable 
{ 
    auto result = *std::next(std::begin(arr), idx); 
    idx = (idx + 1) % arr.size(); 
    return result ; 
}; 
EXPECT_CALL(....).WillRepeatedly(Invoke(valueGenerator)); 

- 這樣做:

int idx = 0; 
auto valueGenerator = [&idx, arr={2,40,7}]() 
{ 
    auto result = *std::next(std::begin(arr), idx); 
    idx = (idx + 1) % arr.size(); 
    return result ; 
}; 
EXPECT_CALL(....).WillRepeatedly(Invoke(valueGenerator)); 

/// Prossible in TearDown - or at the very end of test: 
ASSERT_EQ(0, idx);