2017-03-10 1 views
1

Quelqu'un sait comment programmer une méthode simulation Google pour effectuer de manière répétée une séquence d'actions (un à la fois), alors que nous ne savons pas à l'avance le nombre d'appels à la méthode ?Google Mock: effectuer de manière répétée des actions dans un ordre spécifique

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

Comportement:

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 
... 

Merci

+0

L'idée de l'unité le test est que vous savez à l'avance ce qui devrait se produire dans le code en cours de test. Donc, votre question n'est pas question valable pour UT. – PiotrNycz

+0

En d'autres termes - vous devriez écrire des tests pour le cas où cette séquence se produit une fois, d'autres cas de test lorsque cette séquence se produit deux fois etc ... – PiotrNycz

Répondre

0

Je mentionne déjà dans les commentaires que ce n'est pas vraiment une bonne idée d'écrire des tests unitaires où vous ne pouvez pas avoir le contrôle total ou de connaissances sur ce qui se passe réellement Là.

Mais de toute façon ce qui est faisable - par exemple vous pouvez appeler lambda qui produit le prochain résultat à chaque fois qu'il est appelé:

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)); 

Si vous besoin de vérifier ce n'est pas terminée au milieu de la séquence - faire de cette façon:

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);