2013-08-06 2 views
0

Я пытаюсь выполнить модульное тестирование своего приложения, но я не получу его работу.C++ QT5 LNK 2019 неразрешенный внешний символ (единичный тест)

I habe 2 .pro файлы. Один в моем «основном» проекте и один в «Unittest».

Моя структура Папка:

offline_ip_adress_calculator 
├───updater 
│ └───updater 
├───classes 
│ ├───ip_calculator 
│ └───threads 
├───image 
└───tests 
    └───Unittest 
     └───ip_calculator 

UnitTest .pro файл:

TargetDirectory = C:\build\unit_test 

CONFIG(debug, debug|release) { 
    DESTDIR = $$TargetDirectory\debug 
    OBJECTS_DIR = $$TargetDirectory\debug\.obj 
    MOC_DIR = $$TargetDirectory\debug\.moc 
    RCC_DIR = $$TargetDirectory\debug\.rcc 
    UI_DIR = $$TargetDirectory\debug\.ui 
} else { 
    DESTDIR = $$TargetDirectory\release 
    OBJECTS_DIR = $$TargetDirectory\release\.obj 
    MOC_DIR = $$TargetDirectory\release\.moc 
    RCC_DIR = $$TargetDirectory\release\.rcc 
    UI_DIR = $$TargetDirectory\release\.ui 
} 

QT += testlib 
QT += core 


INSTALLS += target sources 

CONFIG += c++11 


TARGET = maintest 

# Change this Path 
INCLUDEPATH += X:/ip_adress_calculator/offline_ip_adress_calculator 

TEMPLATE = app 

SOURCES += \ 
    qtestqstring.cpp \ 
    ip_calculator/qttestcomboxone.cpp \ 
    main.cpp 

HEADERS += \ 
    qtestqstring.h \ 
    ip_calculator/qttestcomboxone.h 

Мой блок тестовый класс:

#ifndef QTTESTCOMBOXONE_H 
#define QTTESTCOMBOXONE_H 

#include <QObject> 
#include <QtTest/QTest> 


#include "classes/ip_calculator/comboxone.h" 

class QtTestComboxOne : public QObject 
{ 
    Q_OBJECT 

private slots: 
    void QtTestCalculateIndustrialSwitchOne(); 

public: 
    explicit QtTestComboxOne(QObject *parent = 0); 

signals: 

public slots: 

}; 

#endif // QTTESTCOMBOXONE_H 


#include "qttestcomboxone.h" 

QtTestComboxOne::QtTestComboxOne(QObject *parent) : 
    QObject(parent) 
{ 
} 




void QtTestComboxOne::QtTestCalculateIndustrialSwitchOne() 
{ 
    ComboxOne combox_one; 

    combox_one.setCommunicationNumber(1); 
    QCOMPARE(combox_one.calculate(QString("industrial_switch_1")), QString("10.0.20.2")); 
} 

ComboxOne класс:

#ifndef COMBOXONE_H 
#define COMBOXONE_H 

#include "abstractipcalculator.h" 

class ComboxOne : public AbstractIpCalculator 
{ 
public: 
    ComboxOne(); 
    QString calculate(QString); 

private: 
    QString calculateOctetOne(QString); 
    QString calculateOctetTwo(QString); 
    QString calculateOctetThree(QString); 
    QString calculateOctetFour(QString); 
}; 

#endif // COMBOXONE_H 

COmboxOne CPP:

#include "comboxone.h" 

ComboxOne::ComboxOne() 
{ 
    data_structure.enqueue(QPair<QString, QString>("industrial_switch_1", "Industrial Switch I")); 
} 

QString ComboxOne::calculate(QString name) 
{ 
    QString return_value; 

    return_value.append(calculateOctetOne(name)); 
    return_value.append("."); 
    return_value.append(calculateOctetTwo(name)); 
    return_value.append("."); 
    return_value.append(calculateOctetThree(name)); 
    return_value.append("."); 
    return_value.append(calculateOctetFour(name)); 

    return return_value; 
} 

QString ComboxOne::calculateOctetOne(QString name) 
{ 
    return [...]; 
} 

QString ComboxOne::calculateOctetTwo(QString name) 
{ 
    [...] 
    return QString::number(temp_res); 
} 

QString ComboxOne::calculateOctetThree(QString name) 
{ 
    [...] 
    return QString::number(temp_res); 
} 

QString ComboxOne::calculateOctetFour(QString name) 
{ 
    [...] 
    return QString("10"); 

} 

AbstractIpCalculator

#ifndef ABSTRACTIPCALCULATOR_H 
#define ABSTRACTIPCALCULATOR_H 

#include <QString> 
#include <QDebug> 
#include <QPair> 
#include <QQueue> 


class AbstractIpCalculator 
{ 
public: 
    QQueue<QPair<QString,QString> > data_structure; 

    AbstractIpCalculator(); 

    bool setParkNetzId(int index, int value); 
    void setCommunicationNumber(int communication_number); 
    virtual QString calculate(QString) = 0; 

protected: 
    QMap<int, int> park_netz_list; 
    int communication_number; 
    int getParkNetId(); 

    static const int bla_1 = 360; 
    static const int bal_2 = 363; 

private: 
    virtual QString calculateOctetOne(QString) = 0; 
    virtual QString calculateOctetTwo(QString) = 0; 
    virtual QString calculateOctetThree(QString) = 0; 
    virtual QString calculateOctetFour(QString) = 0; 
}; 

#endif // ABSTRACTIPCALCULATOR_H 

испытаний Блок Основные

#include <QTest> 
#include "qtestqstring.h" 
#include "ip_calculator/qttestcomboxone.h" 

int main() 
{ 
    QTestQString string_test; 
    QtTestComboxOne combox_one; 

    QTest::qExec(&string_test); 
    QTest::qExec(&combox_one); 
} 

Я получаю сообщение об ошибке:

qttestcomboxone.obj:-1: Fehler:LNK2019: unresolved external symbol "public: virtual class QString __thiscall ComboxOne::calculate(class QString)" ([email protected]@@[email protected]@[email protected]@Z) referenced in function "private: void __thiscall QtTestComboxOne::QtTestCalculateIndustrialSwitchOne(void)" ([email protected]@@AAEXXZ) 

qttestcomboxone.obj:-1: Fehler:LNK2019: unresolved external symbol "public: void __thiscall AbstractIpCalculator::setCommunicationNumber(int)" ([email protected]@@[email protected]) referenced in function "private: void __thiscall QtTestComboxOne::QtTestCalculateIndustrialSwitchOne(void)" ([email protected]@@AAEXXZ) 

qttestcomboxone.obj:-1: Fehler:LNK2019: unresolved external symbol "public: bool __thiscall AbstractIpCalculator::setParkNetzId(int,int)" ([email protected]@@[email protected]) referenced in function "private: void __thiscall QtTestComboxOne::QtTestCalculateIndustrialSwitchOne(void)" ([email protected]@@AAEXXZ) 

Я думаю, класс «ComboxOne» не может найти родительский класс.

+0

Вы действительно написали код для 'calculate',' setCommunicationNumber' и 'setParkNetzId' (хотя' AbstractIpCalculator' звучит, может быть, у него отсутствует '= 0' для метода, который должен быть реализован в производном классе?) –

+0

Да, код для setCommunicationNumber и setParkNetzId wirtten в AbstractIpCalculator. вычислять - виртуальный QString вычислять (QString) = 0; определенный в AbstractIpCalculator. Я использовал этот класс, но я не могу использовать его в своем модульном тесте, и я не знаю, почему – user2357505

+0

Я подозреваю, что вы забыли файл реализации, в котором определены функции. –

ответ

0

Проблема связана с ComboxOne.cpp, не указана в SOURCES. Так как файл проекта по существу является make-файлом, а фаза связывания сборки основана на SOURCES, если требуемый исходный файл отсутствует, компоновщик не найдет символы ...

Смежные вопросы