Création de mock avec cxxtest
Bonjour,
je me met au test unitaire et j'éprouve de grande difficulté à comprendre comment les mocks fonctionnent. Et internet est assez avare en détail, on n'y trouve que 2-3 example sans plus d'explication.
Je veux réaliser un premier mock qui remplace opendir de <dirent.h>.
Voici donc mes classes :
//dirent_mock.cpp
Code:
1 2 3
| #define CXXTEST_MOCK_TEST_SOURCE_FILE
#include "dirent_mock.h" |
// dirent_mock.h
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #ifndef DIRENT_MOCK_H_
#define DIRENT_MOCK_H_
#include <dirent.h>
#include <cxxtest/Mock.h>
// Prototype: DIR * opendir (const char *dirname)
CXXTEST_MOCK_GLOBAL(
DIR*, // Return type.
opendir, // Name of the function.
(const char* dirname), // Prototype.
(dirname) // Argument list.
);
#endif /* DIRENT_MOCK_H_ */ |
// dirent_real.cpp
Code:
1 2
| #define CXXTEST_MOCK_TEST_SOURCE_FILE
#include <dirent.h> |
// et mon fichier de test
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| #ifndef TESTPLGLOADER_H_
#define TESTPLGLOADER_H_
#include <cxxtest/TestSuite.h>
#include "./mock/dirent/dirent_mock.h"
class MockObject : public T::Base_opendir
{
public:
MockObject() {}
DIR* opendir(const char* dirname) { return opendir("/home/manticore/workspace/");}
};
class testPlgLoader : public CxxTest::TestSuite
{
public:
void test1()
{
TS_ASSERT_EQUALS(2, 2);
}
};
#endif /*TESTPLGLOADER_H_*/ |
Actuellement le code compile, mais j'ai le message d'erreur suivant :
Citation:
Error: untrapped signal:
SIGABRT: execution aborted (failed assertion, corrupted heap, or other problem?)
Ma fonction à tester est la suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| PlgLoader::PlgLoader(const std::string& _pathConfig)
{
// Load configuration.
m_config = Config(_pathConfig);
DIR* rep;
// Je veux tester ce opendir !
rep = opendir(m_config.getPathPlugin().c_str());
struct dirent *lecture;
// Prepare regex for filter .so.
static const boost::regex rx(".*[\\.]so$");
// suite du code coupé
} |
Donc mes questions :
1. Est-ce que je dois remplacer la ligne que je veux tester par T::opendir et modifier l'import pour importer une autres classes ? (Si oui laquelle).
2. Je comprends pas trop cette déclaration au niveau du prototype, pour moi le prototype est le commentaire en dessus, alors que dans les exemples il ne déclare que le type de l'attribut.
Code:
1 2 3 4 5 6 7
| // Prototype: DIR * opendir (const char *dirname)
CXXTEST_MOCK_GLOBAL(
DIR*, // Return type.
opendir, // Name of the function.
(const char* dirname), // Prototype.
(dirname) // Argument list.
); |
Merci de votre aide, je pense que j'ai beaucoup d'erreurs, et du coup ça devient difficile de m'en sortir seul.
p.s. des sources un peu plus complète que la doc officiels sont bienvenus.