c++qtqt-creatorundefined-symbolqttest

Qt Test: error symbol(s) not found when instantiating object in test project


I'm sure I'm just missing something in my original class (conferenceview), but I can't wrap my head around exactly what is missing. When I attempt to build my tst_conferencepage.cpp file, which includes my conferenceview class, I get an error message regarding symbol(s) not found for architecture x86_64 when I try to instantiate an object of type conferenceview.

conferenceview.h:

#ifndef CONFERENCEVIEW_H
#define CONFERENCEVIEW_H
#include "constants.h"

class conferenceView
{
    QString conference; // Holds the current conference selected by the fan
    QString division;   // Holds the current division selected by the fan
public:
    conferenceView(); // Default Constructor
    void setConference(QString);    // Sets the current conference of the fan
    QString getConference();    // Returns the current conference of the fan
    void setDivision(QString);  // Sets the current division of the fan
    QString getDivision();  // Gets the current division of the fan
    QSqlQuery queryConference(QString); // Returns a query for the teams in a specified conference
    QSqlQuery queryDivision(QString);   // Returns a query for the teams in a specified conference
    QSqlQueryModel* populateView(QString, int); // Returns a QSqlQueryModel index to display the queried data to the table view
};

#endif // CONFERENCEVIEW_H

conferenceview.cpp:

#include "conferenceview.h"

conferenceView::conferenceView()
{
    this->conference = "";
    this->division = "";
}

// Assigns conference to passed in QString
void conferenceView::setConference(QString conference) { this->conference = conference; }

// Returns conference
QString conferenceView::getConference() { return this->conference; };

// Assigns division to passed in QString
void conferenceView::setDivision(QString division) { this->division = division; }

// Returns division
QString conferenceView::getDivision() { return this->division; }


QSqlQuery conferenceView::queryConference(QString conference)
{
    this->setConference(conference); // Sets current conference

    // Queries database for team names by conference order by team name
    QSqlQuery q;
    q.prepare("SELECT TeamName "
              "FROM TeamInfo "
              "WHERE Conference = :conf "
              "ORDER BY TeamName");
    q.bindValue(":conf", conference);
    q.exec();

    return q;
}

QSqlQuery conferenceView::queryDivision(QString division)
{
    // Sets current division
    if( this->conference == "American Football Conference")
        this->setDivision(division.prepend("AFC "));
    else
        this->setDivision(division.prepend("NFC "));

    // Queries database for team names by division order by team name
    QSqlQuery q;
    q.prepare("SELECT TeamName "
              "FROM TeamInfo "
              "WHERE Division = :div "
              "ORDER BY TeamName");
    q.bindValue(":div", division);
    q.exec();

    return q;
}

QSqlQueryModel* conferenceView::populateView(QString str, int id)
{
    QSqlQueryModel* qModel = new QSqlQueryModel;

    // if id == 0, sets the qModel to the conference teams
    if(id == 0)
    {
        this->setConference(str);
        qModel->setQuery(this->queryConference(this->getConference()));
    }
    // if id == 1, sets the qModel to the division teams
    else
    {
        this->setDivision(str);
        qModel->setQuery(this->queryDivision(this->getDivision()));
    }

    // Sets the header title of the table view
    qModel->setHeaderData(0, Qt::Horizontal, QObject::tr("Team Name"));

    return qModel;
}

tst_conferencepage.cpp:

#include <QtTest>
#include "../NFL_Teams_App/conferenceview.h"

class ConferencePage : public QObject
{
    Q_OBJECT
    QVector<QString> AFC;
public:
    ConferencePage();
private slots:
    void testAFCConference();
};

ConferencePage::ConferencePage()
{
    this->AFC = {"Baltimore Ravens", "Buffalo Bills", "Cincinnati Bengals",
                 "Cleveland Browns", "Denver Broncos", "Houston Texans",
                 "Indianapolis Colts", "Jacksonville Jaguars", "Kansas City Chiefs",
                 "Los Angeles Chargers", "Miami Dolphins", "New England Patriots",
                 "New York Jets", "Oakland Raiders", "Pittsburgh Steelers", "Tennessee Titans"};
}

void ConferencePage::testAFCConference()
{
    conferenceView c;
    QSqlQuery query = c.queryConference("American Football Conference");
    int index = 0;
    while(query.next())
        QVERIFY(this->AFC.at(index) == query.value(index));
}

The blocked code in ConferencePage::testAFCConference() is where I instantiate an object of type conferenceView and the errors stem from.

UnitTests.pro:

QT += core testlib sql
QT -= gui

TARGET = UnitTests

CONFIG += qt console warn_on depend_includepath testcase
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += \ 
    tst_conferencepage.cpp

Project heirarchy:

Full error message:

Undefined symbols for architecture x86_64:
"conferenceView::queryConference(QString)", referenced from: ConferencePage::testAFCConference() in tst_conferencepage.o "conferenceView::conferenceView()", referenced from: ConferencePage::testAFCConference() in tst_conferencepage.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[1]: * [UnitTests] Error 1 make: * [sub-UnitTests-make_first] Error 2 01:21:30: The process "/usr/bin/make" exited with code 2. Error while building/deploying project NFLTeamsProject (kit: Desktop Qt 5.11.2 clang 64bit) When executing step "Make"

Any help is appreciated, thank you in advance!


Solution

  • You're missing conferenceview.cpp and conferenceview.h in your UnitTest.pro file, so linker doesn't know, what your test should be build from. Your .pro file should looks like below:

    QT += core testlib sql
    QT -= gui
    
    TARGET = UnitTests
    
    CONFIG += qt console warn_on depend_includepath testcase
    CONFIG -= app_bundle
    
    TEMPLATE = app
    
    VPATH = "../NFL_Teams_App"
    
    SOURCES += \ 
        tst_conferencepage.cpp \
        conferenceview.cpp
    
    HEADERS += \
        conferenceview.h