2013-04-16 36 views
9

Dự án của tôi chứa các tệp C. Và trong một số tệp, tôi có các hàm được định nghĩa là tĩnh.Kiểm tra các chức năng tĩnh với CppUnit

Tôi đang sử dụng CppUnit trong các bài kiểm tra đơn vị của mình và tôi muốn kiểm tra các hàm tĩnh này. Tôi biết rằng gọi một chức năng từ bên ngoài tập tin (nơi nó được xác định) là không được phép. Có một giải pháp để tránh vấn đề này để gọi các chức năng tĩnh từ tập tin thử nghiệm C++ của tôi?

+0

Bản sao có thể có của [Làm cách nào để kiểm tra lớp có phương thức riêng, trường hoặc lớp bên trong?] (Https://stackoverflow.com/questions/34571/how-do-i-test-a-class-that -a-riêng-phương pháp-lĩnh vực-hoặc-bên trong-lớp học) – Raedwald

Trả lời

6

Giả sử chúng ta đang nói về các hàm tĩnh C thì giải pháp đơn giản nhất là làm cho các hàm không tĩnh khi bạn đang biên soạn một bản dựng gỡ lỗi. Điều này có nghĩa là các biểu tượng sẽ có sẵn để bạn sử dụng trong các bài kiểm tra đơn vị của bạn. Điều này chỉ hoạt động nếu không có bí danh của các biểu tượng mặc dù.

Nếu bạn xác định biểu tượng DEBUG trên tất cả các debug xây dựng sau đó một cái gì đó như:

#ifdef DEBUG 
#define debug_export 
#else 
#define debug_export static 
#endif 

và sau đó xác định chức năng tĩnh của bạn như thế này

debug_export void foo(void) 
{ 
... 
} 

và một trong hai bao gồm tờ khai điều kiện trong file header hoặc nhập thủ công chúng vào tệp kiểm tra đơn vị của bạn:

extern void foo(void); 

Các cách khác xung quanh nó là bao gồm các bài kiểm tra đơn vị trong chính tệp nguồn (một chút lộn xộn nếu nó bị mất), không bận tâm đến việc kiểm thử đơn vị chức năng (một chút cảnh báo) hoặc để đánh dấu hàm as dll-local thay vì tĩnh và đảm bảo rằng các thử nghiệm đơn vị của bạn là một phần của đối tượng động đó.

+0

Cảm ơn bạn Tôi đã lấy cảm hứng từ một giải pháp dựa trên câu trả lời của bạn. xem câu trả lời của tôi để biết thêm chi tiết – MOHAMED

4

Tôi có một tệp tiêu đề chung mà tôi đưa vào tất cả các tệp nguồn của dự án của mình. Tôi đã thêm các dòng này và sự cố được giải quyết:

#ifdef TEST 
#define static 
#endif 

Tôi thậm chí có thể tránh thêm mã ở trên vào mã nguồn gốc C của mình. Tôi có thể thêm cờ -Dstatic= vào lệnh gcc và tôi cũng thấy điều này hoạt động.

Nhưng chúng ta phải cẩn thận khi sử dụng giải pháp này vì:

  • Chúng ta có thể có cùng một tên biến/chức năng định nghĩa là tĩnh trong 2 tập tin riêng biệt.
  • Chúng tôi có thể có hàm chứa biến được định nghĩa là tĩnh.
1

Có cách nào để cấu trúc lại mã để loại bỏ nhu cầu về phương pháp tĩnh không? Từ quan điểm thiết kế của OO, các số liệu thống kê là hình cầu trên quần áo cừu.

Tôi biết nó không nhất thiết phải là câu trả lời thực tế hoặc nhanh nhất, nhưng bạn sẽ cải thiện thiết kế của bạn bằng cách loại bỏ nó.

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