Тест C++ CppUnit (CPPUNIT_ASSERT)

Я пытаюсь выполнить задание по очистке экрана. Мой 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()'

Я хочу проверить действительность файла только с помощью модульного тестирования. Любая помощь будет оценена. Заранее спасибо!

С уважением, Уоллес


person Wallace    schedule 17.07.2010    source источник


Ответы (2)


bool ScreenScrape::getFile() не является static, поэтому не может вызываться как статическая функция. Вам нужно либо (а) объявить его как static, либо (б) создать экземпляр 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. Эти два шага предотвратят появление ошибок «множественного объявления».

Это исправит ваши ошибки компиляции, но проверка правильности файла не входит в обязанности модульного теста. Модульные тесты не должны взаимодействовать с файловой системой.

person Johnsyweb    schedule 18.07.2010

Если вы собираетесь вызывать ScreenScrape::getfile()а не ss.getfile(), то getfile() необходимо определить как статическое. Ошибка, которую вы получаете, связана с тем, что нестатические методы необходимо вызывать для определенного объекта.

Трудно отследить ошибку в вашей версии, которая определяет объект ScreenScrape, а затем использует его для вызова getfile(); вы, очевидно, не включили весь соответствующий код, поскольку ваш файл screenscrape.h не имеет 259 строк, и вы также не показали исправленный код, в котором вы «используете объект (ss) для вызова getFile()».

person Brooks Moses    schedule 18.07.2010