[SOLVED] Тестовый класс не видит определения методов тестируемого класса



  • Доброго времени суток!
    Есть проект, в нем два subproject'а:

    1. Юнит-тест, созданный через QtCreator
    2. Большая программа, из множества классов, один из которых я хотел бы протетировать.

    Проблема:
    когда я собираю проект юнит теста - линкер говорит undefined reference to на любые методы (в т.ч. конструктор) и таблицу виртуальных функций тестируемого класса.

    Конфигурация:
    Qt 5, mingw.

    ОС: Win7

    pro файл проекта с тестом:
    @
    QT += widgets testlib

    TARGET = tst_triangletests
    CONFIG += console
    CONFIG -= app_bundle

    TEMPLATE = app

    SOURCES += tst_triangletests.cpp

    DEFINES += SRCDIR=\"$$PWD/\"

    HEADERS +=
    tst_triangletests.h
    @

    Заголовок теста:
    @
    #include <QString>
    #include <QtTest/QtTest>

    class TriangleTests : public QObject
    {
    Q_OBJECT

    public:
    TriangleTests();

    private Q_SLOTS:
    void initTestCase();
    void cleanupTestCase();
    void triangleAreaTest();
    };
    @

    Непосредственно код теста:
    @

    #include "tst_triangletests.h"

    #include "../../main/data/trianglesector.h"

    TriangleTests::TriangleTests()
    {
    }

    void TriangleTests::initTestCase()
    {
    }

    void TriangleTests::cleanupTestCase()
    {
    }

    void TriangleTests::triangleAreaTest()
    {
    TriangleSector sect;
    QVERIFY2(true, "Failure");
    }

    QTEST_APPLESS_MAIN(TriangleTests)

    @

    Все что я делаю в тесте - создаю объект класса, который хочу протестировать. При линковке получаю:

    bq.
    debug/tst_triangletests.o: In function ZN13TriangleTests16triangleAreaTestEv': F:\build-RoofX-Desktop_Qt_5_3_0_MinGW_32bit-Debug\tests\TriangleTests/../../../RoofX/tests/TriangleTests/tst_triangletests.cpp:21: undefined reference toTriangleSector::TriangleSector()'
    debug/tst_triangletests.o: In function ZN14TriangleSectorD1Ev': F:\build-RoofX-Desktop_Qt_5_3_0_MinGW_32bit-Debug\tests\TriangleTests/../../../RoofX/tests/TriangleTests/../../main/data/trianglesector.h:10: undefined reference tovtable for TriangleSector'
    F:\build-RoofX-Desktop_Qt_5_3_0_MinGW_32bit-Debug\tests\TriangleTests/../../../RoofX/tests/TriangleTests/../../main/data/trianglesector.h:10: undefined reference to `vtable for TriangleSector'

    Я полагаю дело в том что единственное что видит тест - это заголовок с объявлением тестируемого класса, и, соответственно он не видит определений методов. Но как ему их показать? Если бы основной проект был библиотекой, я мог бы ее прилинковать к тестовому проекту и, думаю, проблема бы разрешилась, однако тестируемый проект собирается в exe. Вообщем как быть, товарищи? Гуглил, бодался два дня с этой проблемой - ничего не нагуглил.. Я, вообщем то, новичек в Qt, да и вообще..

    Если я могу уточнить какие то данные, необходимые для ответа, пожалуйста, дайте мне знать..



  • Добро пожаловать нв форум DevNet!

    Попробуйте добавить исходник класса в тестовый проект.
    Если TriangleSector зависит от других классов или функций то добавте их исходники тоже.

    Или сделайте статическую библиотеку из TriangleSector и его зависимостей и прилинкуйте её к тесту и к приложению

    @
    QT += widgets testlib

    TARGET = tst_triangletests
    CONFIG   += console
    CONFIG   -= app_bundle
     
    TEMPLATE = app
     
     
    SOURCES += \
        tst_triangletests.cpp \
        ../../main/data/trianglesector.cpp
     
    DEFINES += SRCDIR=\\\"$$PWD/\\\"
     
    HEADERS += \
       tst_triangletests.h \
       ../../main/data/trianglesector.h
    

    @



  • AndreyC,

    bq.
    Добро пожаловать нв форум DevNet!

    Спасибо!

    Попробовал описанный вами, первый вариант (как наибыстрейший), да, это действительно помогло, теперь линкер линкует, тесты тестируют)

    Пожалуй, чуть позже реализую второй вариант как архитектурно более красивый.

    Единственный вопрос который у меня остается - получается, нет никаких ограничений на вхождение одного исходника в несколько проектов? Честно говоря, я, почему то, думал, что так нельзя =)



  • Привет! Осмелюсь предложить использовать Google Test под Qt: http://www.prog.org.ru/topic_26944_0.html



  • 8Observer8,

    Спасибо, буду иметь ввиду!



  • Как то я пропустил вопрос.
    [quote author="EvgeniyE" date="1409986536"]Единственный вопрос который у меня остается - получается, нет никаких ограничений на вхождение одного исходника в несколько проектов?[/quote]
    Совершенно верно, нет никаких ограничений на вхождение одного исходника в разные проекты.


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.