2017-05-22 1 views
0

J'ai une fonction dont l'appel que je dois détecter par exemplemaquette google - comment EXPECT_CALL sur un nom de variable à savoir identifiant

EXPECT_CALL(MockClass_obj, target_func());

La signature est:

void MockClass::target_func(HANDLE_t handle);

Argument handle est un type opaque et c'est un ensemble global dans une autre fonction donc oui, je vais devoir le talonner.

Voici le problème: dans la fonction que je teste, je l'appelle MockClass::target_func avec quelques arguments différents selon les branches prises:

//MockClass inherits Class, call f1() with instance of MockClass 
void f1(int a, Class & obj) 
{ 
    switch(a): 
    { 
    case 0: 
     obj.target_func(global_handle_1); 
     break; 
    case 1: 
     obj.target_func(global_handle_2); 
     break; 
    default: 
     obj.target_func(global_handle_3); 

    } 
} 

QUESTION

Comment dois-je faire Expect appel basé sur le nom de l'argument? J'ai besoin de détecter quel chemin a été pris.

Puisque toutes les global_handle_[x] variables seront écrasées par exemple mis à la valeur arbitraire, je pouvais les mettre à global_handle_<x>=<x> puis EXPECT_CALL(MockClass_obj, target_func(<x>));

Je suppose que c'est assez bon mais pour être plus robuste, idéalement, je voudrais EXPECT_CALL sur un nom de variable?

Est-ce possible?

Répondre

2

Ce que vous demandez n'est fondamentalement pas possible avec C++. target_func est passé son argument par valeur, donc il n'y a aucun moyen pour cela (ou la version simulée de celui-ci), pour savoir comment la valeur a été calculée. L'appel peut être obj.target_func(global_handle_1); ou obj.target_func(global_handle_2 - 1); (si ces expressions ont la même valeur).

Je pense que votre meilleure option est de donner à chaque variable globale une valeur unique, puis EXPECT la valeur correcte. Je voudrais a) espacer les valeurs uniques bien à part; b) compter sur les révisions de code pour repérer les personnes effectuant de l'arithmétique sur des valeurs de manipulation.

Si target_fun a pris son argument en référence, alors vous pourrait être en mesure de faire une EXPECT en fonction de l'adresse de la référence - mais je ne voudrais pas déranger.