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
// dirent_mock.h
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 #define CXXTEST_MOCK_TEST_SOURCE_FILE #include "dirent_mock.h"
// dirent_real.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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_ */
// et mon fichier de test
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #define CXXTEST_MOCK_TEST_SOURCE_FILE #include <dirent.h>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Ma fonction à tester est la suivante :Error: untrapped signal:
SIGABRT: execution aborted (failed assertion, corrupted heap, or other problem?)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Merci de votre aide, je pense que j'ai beaucoup d'erreurs, et du coup ça devient difficile de m'en sortir seul.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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. );
p.s. des sources un peu plus complète que la doc officiels sont bienvenus.
Partager