0

画面スクレイピングの割り当てを実行しようとしています。私の cpp は機能しますが、単体テストを統合する方法がわかりません。ファイルの有効性について bool check 単体テストを実行しようとしましたが、次のエラーが表示されます。

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

「ScreenScrape ss;」を宣言してみました。screenscrapetest.h の下で、オブジェクト (ss) を使用して getFile() を呼び出しますが、このエラーの倍数が発生します。

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

単体テストでファイルの有効性を確認したいだけです。どんな助けでも大歓迎です。前もって感謝します!

よろしく、ウォレス

4

2 に答える 2

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

の実装をgetFilecpp ソース ファイルに移動することを検討してください。これらの 2 つの手順により、「複数宣言」エラーが発生するのを防ぐことができます。

これによりコンパイル エラーが修正されますが、ファイルの有効性を確認することは単体テストの責任ではありません。単体テストは、ファイル システムとやり取りしないでください。

于 2010-07-18T07:30:04.387 に答える
0

ScreenScrape::getfile()ではなく呼び出す場合はss.getfile()getfile()を static として定義する必要があります。あなたが得ているエラーは、特定のオブジェクトで非静的メソッドを呼び出す必要があるためです。

getfile()ScreenScrape オブジェクトを定義し、それを使用して;を呼び出すバージョンでエラーを追跡することは困難です。screenscrape.h ファイルには 259 行が含まれていないため、関連するすべてのコードが含まれていないことは明らかです。

于 2010-07-18T00:20:44.027 に答える