0

我正在尝试完成屏幕抓取任务。我的 cpp 工作,但我不知道如何集成我的单元测试。我试图对文件有效性进行布尔检查单元测试,但它给了我这个错误:

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

屏幕截图.cpp:

#include "screenscrape.h"

using namespace std;

int main()
{
    ScreenScrape ss;
    int choice;

    ...
    ...

    ss.matchPatternTest();
}

屏幕截图.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;
}

屏幕截图测试.cpp:

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

CPPUNIT_TEST_SUITE_REGISTRATION (ScreenScrapeTest);

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

屏幕截图测试.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()is not 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 源文件。这两个步骤将防止您收到“多重声明”错误。

这将修复您的编译错误,但检查文件有效性不是单元测试的责任。单元测试不应与文件系统交互。

于 2010-07-18T07:30:04.387 回答
0

如果您要调用ScreenScrape::getfile()而不是ss.getfile(),则getfile()需要将其定义为静态。您得到的错误是因为需要在特定对象上调用非静态方法。

使用定义 ScreenScrape 对象然后使用该对象调用的版本很难追踪错误getfile();您显然没有包含所有相关代码,因为您的screenscrape.h 文件没有259 行,并且您也没有显示“使用对象(ss)调用getFile()”的修改后的代码。

于 2010-07-18T00:20:44.027 回答