Catch – problemy przy testowaniu plików *.cpp – unresolved external symbol

Pojawiły się pewne problemy przy testowaniu plików *.cpp. Dotychczas wszystkie pliki aplikacji objęte testami były zdefiniowane w plikach nagłówkowych *.h, więc problem się nie ujawniał, bo nie był potrzebny żaden kod z plików *.cpp. Dzisiaj postanowiłem napisać test do dość rozbudowanej klasy, której konstruktor został zdefiniowany w pliku *.cpp i niestety pojawił się błąd „unresolved external symbol”. Trochę czasu zajęło mi znalezienie przyczyny, którą był brak dołączonych plików *.cpp zawierających definicje konstruktorów i metod. Rozwiązaniem problemu było dołączenie plików *.cpp aplikacji do projektu test.pro.

QT       += core gui

TARGET = NonogramsTests
TEMPLATE = app

CONFIG += console

SOURCES += TestMain.cpp \
    LineOfPixelsTest.cpp \
    AddressOnDrawingAreaTest.cpp \
    ArrayOfPixelsTest.cpp \
    AllLinesDescriptionTest.cpp

SOURCES += ../app/field/AddressOnDrawingArea.cpp \
    ../app/field/AddressOnBlocksDescription.cpp \
    ../app/field/AllLinesDescription.cpp \
    

INCLUDEPATH += \
    ../app \
    ../lib

HEADERS +=

Niestety konieczne jest tutaj ręczne zarządzanie tymi plikami, ponieważ przy tworzeniu nowej klasy lub pliku źródłowego kreator może dodać go tylko do jednego projektu (app.pro lub test.pro), a nie do dwóch jednocześnie. Częściowym rozwiązaniem tej niedogodności mógłby być podział projektu na trzy części: app.pro zawierający tylko plik main, test.pro z testami oraz lib.pro zawierający wszystkie pliki źródłowe klas. Projekt lib.pro byłby dołączany (linkowany) do projektów app.pro i test.pro. Nie testowałem jednak tego rozwiązania w praktyce. Przykład takiej struktury projektu.

Przy okazji napiszę, że warto pisać testy. Ułatwiają one pisanie bardziej skomplikowanych funkcji bądź takich gdzie można pomylić się „o jeden”. Funkcję void insertDescriptionBefore(BlockDescription blockDescription) w klasie AllLinesDescription implementowałem zaczynając od napisania testów sprawdzających czy metoda działa prawidłowo i otrzymujemy właściwe dane, a dopiero później dopasowywałem kod tej metody tak, aby przechodziła pozytywnie wszystkie testy. Myślę, że bez testów jednostkowych napisanie tej funkcji zajęłoby o wiele więcej czasu i nerwów.

GitHub

Dodaj komentarz

Twój adres email nie zostanie opublikowany.