2010-07-17 134 views
0

我正在嘗試做一個屏幕抓取任務。我的cpp工作,但我不知道如何整合我的單元測試。我試圖對文件的有效性做了布爾檢查單元測試,但它給我這個錯誤:C++ CppUnit測試(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 

我試圖宣佈 「屏幕抓取SS;」下screenscrapetest.h,使用對象(SS)來調用的GetFile(),但它給我這個錯誤的倍數:

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

我只想與單元測試,以檢查文件的有效性。任何幫助將不勝感激。 在此先感謝!

問候, 華萊士

回答

2

bool ScreenScrape::getFile()不是static,所以不能被稱爲靜態函數。您需要(a)將其聲明爲static或(b)創建ScreenScrape的實例並從中調用getFile()。看看代碼,這並不是很明顯,爲什麼這個函數是類的一個方法,但它可能還處於開發的早期階段。它也可以被重構以去除大量的冗餘代碼:

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

不要忘記你的包括警衛screenscrape.h

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

,並考慮getFile實施移動到CPP源文件。這兩個步驟將防止您獲得「多個聲明」錯誤。

這將修復您的編譯錯誤,但檢查文件有效性不是單元測試的責任。單元測試不應該與文件系統交互。

0

如果你將要調用ScreenScrape::getfile()而非ss.getfile(),然後getfile()需求被定義爲靜態的。你得到的錯誤是因爲需要在特定對象上調用非靜態方法。

很難找到定義ScreenScrape對象的版本的錯誤,然後使用它來調用getfile();你顯然沒有包含所有相關的代碼,因爲你的screenscrape.h文件沒有259行,並且你還沒有顯示修改過的代碼,你在其中「使用一個對象(ss)來調用getFile()」。