首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ CppUnit测验(CPPUNIT_ASSERT)

C++ CppUnit测验(CPPUNIT_ASSERT)
EN

Stack Overflow用户
提问于 2010-07-17 23:14:22
回答 2查看 2.7K关注 0票数 0

我在试着做一项屏幕抓取任务。我的cpp工作,但我不知道如何集成我的单元测试。我试图对文件的有效性进行一个bool检查单元测试,但是它给了我一个错误:

代码语言:javascript
复制
error: cannot call member function 'bool ScreenScrape::getFile()' without object

screenscrape.cpp:

代码语言:javascript
复制
#include "screenscrape.h"

using namespace std;

int main()
{
    ScreenScrape ss;
    int choice;

    ...
    ...

    ss.matchPatternTest();
}

screenscrape.h:

代码语言:javascript
复制
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:

代码语言:javascript
复制
#include "screenscrapetest.h"
#include "screenscrape.h"

CPPUNIT_TEST_SUITE_REGISTRATION (ScreenScrapeTest);

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

screenscrapetest.h:

代码语言:javascript
复制
#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(),但是它给出了这个错误的倍数:

代码语言:javascript
复制
/home/user/NetBeansProjects/Assignment1/screenscrape.h:259: multiple definition of `ScreenScrape::getFile()'

我只想通过单元测试检查文件的有效性。任何帮助都将不胜感激。提前感谢!

你好,华莱士

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-18 07:30:04

bool ScreenScrape::getFile()不是static,因此不能作为静态函数调用。您需要(a)将其声明为static,或者(b)创建一个ScreenScrape实例并从中调用getFile()

看一下代码,不清楚为什么这个函数是类的一种方法,但是它可能还处于开发的早期阶段。还可以重构以删除大量冗余代码:

代码语言:javascript
复制
bool ScreenScrape::getFile()
{
    std::ifstream fin("yahoofinance.htm");
    return fin.good();
}

别忘了你在screenscrape.h里的护卫

代码语言:javascript
复制
#ifndef SCREENSCRAPE_H
#define SCREENSCRAPE_H
// Class declaration here...
#endif//ndef SCREENSCRAPE_H

并考虑将getFile的实现移到cpp源文件中。这两个步骤将防止您获得“多个声明”错误。

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

票数 2
EN

Stack Overflow用户

发布于 2010-07-18 00:20:44

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3273621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档