Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  1. #1
    Membre expérimenté

    Profil pro Marc
    Ingénieur développement logiciels
    Inscrit en
    novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Nom : Marc
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : novembre 2009
    Messages : 377
    Points : 509
    Points
    509

    Par défaut 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 :

    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.

  2. #2
    Inactif


    Homme Profil pro Guillaume Belz
    Biochimiste
    Inscrit en
    novembre 2008
    Messages
    5 318
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume Belz
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Biochimiste
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 318
    Points : 17 318
    Points
    17 318

    Par défaut

    Bonjour

    Je connais pas trop cxxTest, ma réponse correspond à ce que j'ai compris de la doc

    1. Oui, dans PlgLoader:lgLoader, tu dois appeler T::opendir et ajouter l'include #include <dirent_mock.h>

    2. Pas trop compris ta question. La partie commentée est la signature de la fonction, la macro permet de déclarer une fonction T::opendir qui a la même signature (et qui fait probablement d'autres choses en interne)

    Pas recherché d'autres sources d'information que la doc officielle

    Bon courage

  3. #3
    Membre expérimenté

    Profil pro Marc
    Ingénieur développement logiciels
    Inscrit en
    novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Nom : Marc
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : novembre 2009
    Messages : 377
    Points : 509
    Points
    509

    Par défaut

    1. Ok, après plusieurs relecture j'en étais venu à la même conclusion que toi.

    2. Ce que je comprends pas trop c'est le points suivant de la structure :

    Code :
    (const char* dirname),        // Prototype.
    C'est quoi leur prototype, pour eclipse apparemment la signature est équivalente au prototype

    Donc j'ai corrigé le code, mais ça ne marche toujours pas.

  4. #4
    Inactif


    Homme Profil pro Guillaume Belz
    Biochimiste
    Inscrit en
    novembre 2008
    Messages
    5 318
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume Belz
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Biochimiste
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 318
    Points : 17 318
    Points
    17 318

    Par défaut

    Dans la signature, tu as aussi le nom de la fonction et ses modificateurs
    Pour l'erreur, faudra que je teste demain

  5. #5
    Membre expérimenté

    Profil pro Marc
    Ingénieur développement logiciels
    Inscrit en
    novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Nom : Marc
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : novembre 2009
    Messages : 377
    Points : 509
    Points
    509

    Par défaut

    Après moult heures perdu pour rien, je vais migrer sur un autre environnement de test, celui-ci est tellement peu documenté, c'est la misère.

  6. #6
    Modérateur

    Homme Profil pro Cyrille
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Nom : Homme Cyrille
    Âge : 27
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 067
    Points : 4 872
    Points
    4 872

    Par défaut

    Ici nous utilisons CPPUNIT.
    Je n'ai pas eu grand mal à le prendre en main en me basant sur les exemples existants

  7. #7
    Membre expérimenté

    Profil pro Marc
    Ingénieur développement logiciels
    Inscrit en
    novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Nom : Marc
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : novembre 2009
    Messages : 377
    Points : 509
    Points
    509

    Par défaut

    Merci, je vais migrer vers celui-ci.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •