2012-12-23 11 views
16

Voglio creare test di unità per un progetto di Visual C++. Ho provato a seguire these MSDN instructions. Ho trovato pagine in cui distinguono tra codice non gestito/misto/puro, ma non capisco appieno questi concetti. Il mio codice non usa .NET e verrebbe probabilmente compilato in MinGW con alcune modifiche al codice.Esterni non risolti durante la compilazione dei test di unità per Visual C++ 2012

Il mio progetto principale crea un eseguibile, quindi ho seguito i passaggi sotto Per fare riferimento alle funzioni esportate dal progetto di test. Per cominciare ho avuto diverse opzioni di progetto:

sono andato con Native Unit Test Progetto. Ho aggiunto un riferimento al mio progetto principale e ho impostato Includi directory a $(SolutionDir)\Cubes;$(IncludePath). Ho scritto il mio codice e ottenuto questo durante la compilazione:

1>Creating library C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.lib and object C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.exp 
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: __thiscall Room::Room(void)" ([email protected]@[email protected]) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" ([email protected]@[email protected]@QAEXXZ) 
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: __thiscall Layout::Layout(class Room *,int)" ([email protected]@[email protected]@@[email protected]) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" ([email protected]@[email protected]@QAEXXZ) 
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Layout::add(int,int,class Room *)" ([email protected]@@[email protected]@@Z) referenced in function "public: void __thiscall CubesTest::LayoutTest::NumOfRoomsConsistency(void)" ([email protected]@[email protected]@QAEXXZ) 
1>LayoutTest.obj : error LNK2019: unresolved external symbol "public: void __thiscall Layout::clear(int,int,bool)" ([email protected]@@[email protected]) referenced in function [email protected]@[email protected]@QAEXXZ$0 
1>C:\Users\Pieter\Dropbox\Unief\TTUI\TTUIproject\Cubes\Debug\CubesTest.dll : fatal error LNK1120: 4 unresolved externals 

Se non mi sbaglio, questo significa che il compilatore trova i file di intestazione, ma non i file di origine. Cosa mi manca?

+1

No, questo significa che ** ** linker non trova i file binari contenenti i simboli di riferimento. – SomeWittyUsername

+0

Come posso dire al linker dove trovare i file richiesti? Ho già provato [questo] (http://i.imgur.com/jitTd.png) senza successo. – Pieter

+0

Questo dovrebbe fare il trucco. Assicurati inoltre * di * davvero * di compilare tutti i progetti contenenti i tuoi file (controlla le dipendenze) – SomeWittyUsername

risposta

14

Questa è una descrizione dettagliata su come aggiungere un EXE come destinazione del test dell'unità.

Il punto chiave è "esportare" le funzioni/classi che si desidera testare ... È possibile scaricare l'esempio completo qui: http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip (Non ho modificato alcuna impostazione del progetto, quindi tutte le modifiche che è possibile vedere nella fonte -codice, ovviamente alcune parti possono essere fatte nelle impostazioni del progetto).

  1. Creare un'applicazione Win32 (Console o MFC o Windows, non importa); Ho creato un progetto di console chiamato CPP_UnitTestApp:

  2. Aggiungi una funzione che desideri testare (puoi anche aggiungere classi). Per esempio:

    int Plus1(int i) 
    { 
        return i+1; 
    } 
    
  3. Aggiungi un file di intestazione per le funzioni che si desidera verificare: CPP_UnitTestApp.h

  4. Mettere la dichiarazione dei metodi nel file di intestazione, e anche esportare queste funzioni!

    #pragma once 
    
    #ifdef EXPORT_TEST_FUNCTIONS 
    
    #define MY_CPP_UNITTESTAPP_EXPORT __declspec(dllexport) 
    #else 
    #define MY_CPP_UNITTESTAPP_EXPORT 
    #endif 
    
    MY_CPP_UNITTESTAPP_EXPORT int Plus1(int i); 
    
  5. Includere questo file di intestazione nel main-cpp (qui CPP_UnitTestApp.cpp) e definire la EXPORT_TEST_FUNCTIONS prima di includere l'intestazione:

    #define EXPORT_TEST_FUNCTIONS 
    #include "CPP_UnitTestApp.h" 
    
  6. Ora aggiungere un nuovo progetto (progetto unit test Native : UnitTest1)

  7. includere l'intestazione e il lib al file "unittest1.cpp" (adottare i percorsi come volete):

    #include "..\CPP_UnitTestApp.h" 
    #pragma comment(lib, "../Debug/CPP_UnitTestApp.lib") 
    
  8. Vai alle impostazioni di progetto del progetto di test aggiungi aggiungi un riferimento al progetto "UnitTest1" (Progetto | Proprietà | Proprietà comuni | Aggiungi nuovo riferimento ...: Selezionare alla voce "Progetti", la "CPP_UnitTestApp" -Project)

  9. Creare la funzione di test di unità:

    TEST_METHOD(TestMethod1) 
    { 
        int res = Plus1(12); 
        Assert::AreEqual(13, res); 
    } 
    
  10. Eseguire il test di unità;)

Come si può vedere, il punto principale era esportare la dichiarazione di funzione! Questo viene fatto tramite __declspec(dllexport) anche se è un EXE.

Come ho già detto, il progetto demo può essere scaricato qui: http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip

Problemi correlati