IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Création de mock avec cxxtest


Sujet :

C++

  1. #1
    Membre confirmé

    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 : 597
    Points
    597
    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 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    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 confirmé

    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 : 597
    Points
    597
    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 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    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 confirmé

    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 : 597
    Points
    597
    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
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 958
    Points
    32 958
    Billets dans le blog
    4
    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
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Membre confirmé

    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 : 597
    Points
    597
    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, 19h06
  2. [DEBUTANT] Création site marchand avec SGBD
    Par plex dans le forum Débuter
    Réponses: 7
    Dernier message: 10/02/2005, 15h19
  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, 17h21
  4. Création de table avec index
    Par Seb7 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/04/2003, 17h11
  5. Création d'agrégat avec SQLServer
    Par Testav dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 19/09/2002, 17h54

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