2012-12-23 15 views
16

Tôi muốn tạo các bài kiểm tra đơn vị cho một dự án Visual C++. Tôi đã thử theo dõi these MSDN instructions. Tôi đã tìm thấy các trang mà họ phân biệt giữa mã không được quản lý/hỗn hợp/thuần túy, nhưng tôi không hiểu đầy đủ các khái niệm đó. Mã của tôi không sử dụng .NET và có khả năng biên dịch theo MinGW với một vài điều chỉnh mã.Các phần bên ngoài chưa được giải quyết khi biên dịch các bài kiểm tra đơn vị cho Visual C++ 2012

Dự án chính của tôi xây dựng một tệp thực thi, vì vậy tôi đã làm theo các bước dưới Để tham chiếu các hàm đã xuất từ ​​dự án thử nghiệm. Đối với người mới bắt đầu tôi đã lựa chọn dự án khác nhau:

tôi đã đi với Dự án Native Unit Test. Tôi đã thêm tham chiếu vào dự án chính của mình và tôi đặt Bao gồm các thư mục đến $(SolutionDir)\Cubes;$(IncludePath). Tôi đã viết mã của tôi và nhận được điều này khi biên soạn:

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 

Nếu tôi không nhầm, điều này có nghĩa là trình biên dịch tìm thấy tệp tiêu đề chứ không phải tệp nguồn. Tôi đang thiếu gì?

+1

Không, đó có nghĩa là mối liên kết ** ** không tìm thấy tập tin nhị phân chứa các ký hiệu tham chiếu của bạn. – SomeWittyUsername

+0

Phải, làm cách nào để cho trình liên kết biết nơi tìm các tệp được yêu cầu? Tôi đã thử [this] (http://i.imgur.com/jitTd.png) mà không thành công. – Pieter

+0

Điều đó sẽ làm được điều này. Ngoài ra hãy chắc chắn rằng bạn * thực sự * biên dịch tất cả các dự án chứa các tệp của bạn (kiểm tra các phụ thuộc) – SomeWittyUsername

Trả lời

14

Dưới đây là mô tả từng bước về cách thêm EXE làm mục tiêu thử nghiệm đơn vị.

Điểm mấu chốt là "xuất" các chức năng/lớp bạn muốn kiểm tra ... Bạn có thể tải xuống mẫu hoàn chỉnh tại đây: http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip (Tôi không thay đổi bất kỳ cài đặt dự án nào, vì vậy tất cả thay đổi bạn có thể thấy trong nguồn -code; tất nhiên, một số phần có thể được thực hiện trong các thiết lập dự án).

  1. Tạo ứng dụng Win32 (Bảng điều khiển hoặc MFC hoặc Windows, không quan trọng); Tôi đã tạo một dự án bảng điều khiển có tên là CPP_UnitTestApp:

  2. Thêm chức năng bạn muốn kiểm tra (bạn cũng có thể thêm các lớp). Ví dụ:

    int Plus1(int i) 
    { 
        return i+1; 
    } 
    
  3. Thêm một tập tin tiêu đề cho các chức năng bạn muốn kiểm tra: CPP_UnitTestApp.h

  4. Đặt khai báo của phương pháp vào các tập tin tiêu đề, và cũng có thể xuất khẩu các chức năng này!

    #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. Bao gồm tập tin tiêu đề này trong chính-cpp (ở đây CPP_UnitTestApp.cpp) và xác định các EXPORT_TEST_FUNCTIONS trước bao gồm cả tiêu đề:

    #define EXPORT_TEST_FUNCTIONS 
    #include "CPP_UnitTestApp.h" 
    
  6. Bây giờ thêm một dự án mới (dự án thử nghiệm đơn vị Native : UnitTest1)

  7. Bao gồm các tiêu đề và lib vào file "unittest1.cpp" (thông qua các đường dẫn như bạn muốn):

    #include "..\CPP_UnitTestApp.h" 
    #pragma comment(lib, "../Debug/CPP_UnitTestApp.lib") 
    
  8. Chuyển đến cài đặt dự án của dự án thử nghiệm thêm tham chiếu vào dự án "UnitTest1" (Dự án | Thuộc tính | Thuộc tính chung | Thêm tham chiếu mới ...: Chọn mục "Dự án" the "CPP_UnitTestApp" án)

  9. Tạo chức năng đơn vị kiểm tra:

    TEST_METHOD(TestMethod1) 
    { 
        int res = Plus1(12); 
        Assert::AreEqual(13, res); 
    } 
    
  10. Chạy thử nghiệm đơn vị của bạn;)

Như bạn có thể thấy, điểm chính là xuất khẩu khai báo chức năng! Việc này được thực hiện qua __declspec(dllexport) ngay cả khi đó là EXE.

Như tôi đã nói, các dự án trình diễn có thể được tải về tại đây: http://blog.kalmbachnet.de/files/CPP_UnitTestApp.zip

Các vấn đề liên quan