我在试着做一项屏幕抓取任务。我的cpp工作,但我不知道如何集成我的单元测试。我试图对文件的有效性进行一个bool检查单元测试,但是它给了我一个错误:
error: cannot call member function 'bool ScreenScrape::getFile()' without objectscreenscrape.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()'我只想通过单元测试检查文件的有效性。任何帮助都将不胜感激。提前感谢!
你好,华莱士
发布于 2010-07-18 07:30:04
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源文件中。这两个步骤将防止您获得“多个声明”错误。
这将修复您的编译错误,但检查文件有效性并不是单元测试的责任。单元测试不应与文件系统交互。
发布于 2010-07-18 00:20:44
如果要调用ScreenScrape::getfile()而不是ss.getfile(),则需要将getfile()定义为静态。您所得到的错误是因为需要对特定对象调用非静态方法。
很难用定义ScreenScrape对象的版本跟踪错误,然后使用该版本调用getfile();显然,您没有包含所有相关代码,因为您的screenscrape.h文件没有259行,您也没有显示“使用object (ss)调用getFile()”的修改代码。
https://stackoverflow.com/questions/3273621
复制相似问题