Ceci est très étroitement liée à How to use gmock to test that a class calls it's base class' methods mais j'ai du mal à obtenir ce travail avec mon exemple.Comment utiliser GMock vérifier la fonction de classe de base est appelée
J'utilise gtest et GMock pour tester conduire une nouvelle fonctionnalité, donc j'ai une classe de base ...
class SimpleObject
{
public:
explicit SimpleObject() {}
virtual void moveX(int dX)
{
// Do important stuff like updating position, bounding box etc.
}
// ...
};
Sur la base d'autres TDD j'ai une classe dérivée et la nouvelle fonctionnalité est telle que lorsque J'appelle moveX sur l'objet dérivé, il va faire quelque chose de spécifique, mais il doit aussi faire les choses importantes dans SimpleObject :: moveX.
Je possède déjà des tests unitaires pilotés par test liés à la fonction SimpleObject :: moveX, donc je ne veux pas les répéter pour la classe dérivée. Tant que je sais SimpleObject :: moveX est appelé alors tout est Hunky Dory.
Quoi qu'il en soit, basé sur le lien ci-dessus et suivant TDD je me suis retrouvé avec ce qui suit.
La classe dérivée:
class ComplexObject : public SimpleObject
{
public:
virtual void moveX(int dX)
{
// Do something specific
}
};
La classe 'testables':
class TestableComplexObject : public ComplexObject
{
public:
MOCK_METHOD1(moveX, void(int dX));
void doMoveX(int dX)
{
SimpleObject::moveX(dX);
}
};
Le test:
TEST_F(ATestableComplexObject, CallsBaseClassMoveXWhenMoveXIsCalled)
{
int dX(8);
TestableComplexObject obj;
EXPECT_CALL(obj, moveX(dX))
.Times(1)
.WillRepeatedly(testing::Invoke(&obj, &TestableComplexObject::doMoveX));
obj.moveX(dX);
}
Si je lance mes tests, tout passe. Ce n'est pas correct car comme vous pouvez le voir ComplexObject :: moveX ne fait rien. En outre, indépendamment de ce que j'ai mis dans doMoveX (que je pensais était destiné à définir mes attentes) les tests vont encore passer.
Je suis évidemment manquer quelque chose de simple ici, donc des idées?
Les tests passent indépendamment de ce que j'ai mis dans doMoveX, d'où vient la confusion. De plus, si j'appelle ComplexObject :: doMoveX alors sûrement cela appellera la fonction dérivée et non la fonction de base dont j'ai besoin pour m'assurer qu'elle est appelée? –
Oui, la dernière déclaration était une faute de frappe. Je vais éditer le message original –