1. #1
    Membre expérimenté

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

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

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

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define CXXTEST_MOCK_TEST_SOURCE_FILE
     
    #include "dirent_mock.h"
    // dirent_mock.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
    #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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define CXXTEST_MOCK_TEST_SOURCE_FILE
    #include <dirent.h>
    // et mon fichier de test
    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 :

    Error: untrapped signal:

    SIGABRT: execution aborted (failed assertion, corrupted heap, or other problem?)
    Ma fonction à tester est la suivante :

    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.

    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.
    );
    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
    Inscrit en
    novembre 2008
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 308
    Points : 15 143
    Points
    15 143

    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
    Ingénieur développement logiciels
    Inscrit en
    novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

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

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

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    (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
    Inscrit en
    novembre 2008
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : novembre 2008
    Messages : 5 308
    Points : 15 143
    Points
    15 143

    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
    Ingénieur développement logiciels
    Inscrit en
    novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

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

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

    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
    Network programmer
    Inscrit en
    juin 2010
    Messages
    2 645
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Network programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 2 645
    Points : 7 492
    Points
    7 492

    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
    Ingénieur développement logiciels
    Inscrit en
    novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

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

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

    Par défaut

    Merci, je vais migrer vers celui-ci.

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

Discussions similaires

  1. [VB.NET] Création de control avec visual studio
    Par HULK dans le forum Windows Forms
    Réponses: 6
    Dernier message: 01/08/2007, 18h06
  2. [DEBUTANT] Création site marchand avec SGBD
    Par plex dans le forum Débuter
    Réponses: 7
    Dernier message: 10/02/2005, 14h19
  3. [Ant] [Ejb] Probléme de création d'ejb avec Genic
    Par rivierem dans le forum JOnAS
    Réponses: 7
    Dernier message: 25/06/2004, 16h21
  4. Création de table avec index
    Par Seb7 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/04/2003, 16h11
  5. Création d'agrégat avec SQLServer
    Par Testav dans le forum MS SQL-Server
    Réponses: 4
    Dernier message: 19/09/2002, 16h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo