2010-07-17 12 views
0

J'essaye de créer une assignation de grattage d'écran. Mon cpp fonctionne, mais je ne sais pas comment intégrer mes tests unitaires. J'ai essayé de faire un test de l'unité de contrôle bool pour la validité du fichier, mais il me donne cette erreur:Test CppUnit C++ (CPPUNIT_ASSERT)

error: cannot call member function 'bool ScreenScrape::getFile()' without object 

screenscrape.cpp:

#include "screenscrape.h" 

using namespace std; 

int main() 
{ 
    ScreenScrape ss; 
    int choice; 

    ... 
    ... 

    ss.matchPatternTest(); 
} 

screenscrape.h:

class ScreenScrape 
{ 
    public: 
    ScreenScrape(); 
     void parserTest(int choice); 
     void matchPatternTest(); 
     void setIndexValue(string data, string IndexName); 
     void setIndexChange(string data); 
     void setIndexPercent(string data); 
     void setIndexDate(string data); 
     bool getFile(); 
    private: 
     string IndexName; 
     string IndexValue; 
     string IndexChange; 
     string IndexPercent; 
     string IndexVID; 
     string IndexCID; 
     string IndexPID; 
     string IndexDate; 
}; 

bool ScreenScrape::getFile() 
{ 
    string file1 = "yahoofinance.htm"; 
    char* file2 = new char [file1.size()+1]; // parse file for c string conversion 
    strcpy(file2, file1.c_str());    // converts to c string 

    ifstream fin; 

    fin.open(file2); 
    if(fin.good()) 
     return true; 
    else 
     return false; 
} 

screenscrapetest.cpp:

#include "screenscrapetest.h" 
#include "screenscrape.h" 

CPPUNIT_TEST_SUITE_REGISTRATION (ScreenScrapeTest); 

void ScreenScrapeTest::fileTest() 
{ 
    CPPUNIT_ASSERT(ScreenScrape::getFile()); // test file validity 
} 

screenscrapetest.h:

#ifndef _SCREENSCRAPETEST_H 
#define _SCREENSCRAPETEST_H 
#include <cppunit/TestCase.h> 
#include <cppunit/extensions/HelperMacros.h> 
#include "screenscrape.h" 

class ScreenScrapeTest : public CppUnit::TestFixture 
{ 
    CPPUNIT_TEST_SUITE (ScreenScrapeTest); 
    CPPUNIT_TEST (fileTest); 
    CPPUNIT_TEST_SUITE_END(); 
    public: 
     void fileTest(); 
}; 
#endif 

J'ai essayé de déclarer "ScreenScrape art;" sous screenscrapetest.h, utilisez un objet (art) pour appeler getFile() mais il me donne des multiples de cette erreur:

/home/user/NetBeansProjects/Assignment1/screenscrape.h:259: multiple definition of `ScreenScrape::getFile()' 

Je veux seulement vérifier la validité des fichiers avec des tests unitaires. Toute aide serait appréciée. Merci d'avance!

Cordialement, Wallace

Répondre

2

bool ScreenScrape::getFile() n'est pas static, donc ne peut pas être appelé comme une fonction statique. Vous devez (a) le déclarer comme static ou (b) créer une instance de ScreenScrape et appeler le getFile().

En regardant le code, on ne voit pas pourquoi cette fonction est une méthode de la classe, mais peut-être est-elle encore aux premiers stades du développement. Il peut également être refactorisé pour enlever beaucoup de code redondant:

bool ScreenScrape::getFile() 
{ 
    std::ifstream fin("yahoofinance.htm"); 
    return fin.good(); 
} 

Ne pas oublier votre incluent des gardes dans screenscrape.h:

#ifndef SCREENSCRAPE_H 
#define SCREENSCRAPE_H 
// Class declaration here... 
#endif//ndef SCREENSCRAPE_H 

et envisager de déplacer la mise en œuvre de getFile au fichier source cpp . Ces deux étapes vous empêcheront d'obtenir les erreurs de "déclaration multiple".

Ceci corrigera vos erreurs de compilation, mais vérifier la validité du fichier n'est pas la responsabilité d'un test unitaire. Les tests unitaires ne doivent pas interagir avec le système de fichiers.

0

Si vous allez à appeler ScreenScrape::getfile() plutôt que ss.getfile(), puis getfile() besoins définis comme statique. L'erreur que vous obtenez est due au fait que les méthodes non statiques doivent être appelées sur un objet spécifique.

Il est difficile de localiser l'erreur avec votre version qui définit un objet ScreenScrape et l'utilise ensuite pour appeler getfile(); vous n'avez évidemment pas inclus tout le code pertinent puisque votre fichier screenscrape.h n'a pas 259 lignes, et vous n'avez pas non plus montré le code révisé dans lequel vous "utilisez un objet (ss) pour appeler getFile()".