C ++ CppUnit Test (CPPUNIT_ASSERT) - PullRequest
       2

C ++ CppUnit Test (CPPUNIT_ASSERT)

0 голосов
/ 18 июля 2010

Я пытаюсь выполнить задание по очистке экрана. Мой cpp работает, но я не знаю, как интегрировать мой юнит-тестирование. Я попытался выполнить булевский модульный тест для проверки правильности файла, но он выдает мне эту ошибку:

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 используйте объект (ы) для вызова getFile (), но он дает мне кратные значения этой ошибки:

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

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

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

Ответы [ 2 ]

2 голосов
/ 18 июля 2010

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. Эти два шага не позволят вам получить ошибки «множественного объявления».

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

0 голосов
/ 18 июля 2010

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

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

...