2010-03-07 46 views

Trả lời

26

Hãy thử điều này (trực tiếp từ tài liệu của Google thử nghiệm ...):

FRIEND_TEST(TestCaseName, TestName); 

Ví dụ:

// foo.h 
#include <gtest/gtest_prod.h> 

// Defines FRIEND_TEST. 
class Foo { 
    ... 
private: 
    FRIEND_TEST(FooTest, BarReturnsZeroOnNull); 
    int Bar(void* x); 
}; 

// foo_test.cc 
... 
TEST(FooTest, BarReturnsZeroOnNull) { 
    Foo foo; 
    EXPECT_EQ(0, foo.Bar(NULL)); 
    // Uses Foo's private member Bar(). 
} 
+0

Còn nếu tôi có một thử nghiệm khác, ví dụ: BarReturnsOneOnSth. Tôi có phải thêm một tuyên bố FRIEND_TEST khác cho bài kiểm tra đó không? – pajton

+1

Có. Mỗi bài kiểm tra về mặt kỹ thuật là một lớp, và bạn cần phải kết bạn với nhau mỗi lần. – hobbit

+15

Làm thế nào tôi có thể làm điều đó theo cách mà không buộc tôi phải bao gồm các tập tin tiêu đề googletest trong tập tin tiêu đề với lớp 'Foo'? –

19

Tôi biết điều này là cũ nhưng tôi đang tìm kiếm câu trả lời cùng một ngày hôm nay. "gtest_prod.h" chỉ giới thiệu một macro đơn giản để tham chiếu các lớp thử nghiệm.

#define FRIEND_TEST(test_case_name, test_name)\ 
friend class test_case_name##_##test_name##_Test 

Vì vậy FRIEND_TEST(FooTest, BarReturnsZeroOnNull); tương đương với:

friend class FooTest_BarReturnsZeroOnNull_Test; 

này hoạt động bởi vì mỗi bài kiểm tra là lớp riêng của mình như đã đề cập trong các câu trả lời trước.

+0

@DaveRuske Vui lòng không giải thích chỉnh sửa của bạn trong bản chỉnh sửa. Đó là những gì tóm tắt chỉnh sửa. Nếu vấn đề là giới hạn 6 ký tự, bạn có thể thêm một '' vào một nơi nào đó trong cơ thể ('' là một chú thích và do đó sẽ không hiển thị). –

0

Một chiến lược tốt hơn là không cho phép kiểm tra kết bạn trong các bài kiểm tra đơn vị của bạn.

Cho phép kiểm tra bạn bè truy cập các thành viên riêng tư sẽ dẫn đến cơ sở mã khó duy trì. Các phép thử phá vỡ bất cứ khi nào các chi tiết thực hiện bên trong của một thành phần được tái cấu trúc không phải là những gì bạn muốn. Thay vào đó, nếu nỗ lực bổ sung được đưa vào thiết kế nơi các thành phần có thể được kiểm tra thông qua giao diện công cộng của chúng, bạn sẽ nhận được các kiểm tra chỉ cần cập nhật bất cứ khi nào giao diện công cộng của thành phần được cập nhật.

Thử nghiệm dựa trên gtest/gtest_prod.h nên được xem là dấu hiệu của thiết kế kém.

+1

Tôi hiểu rằng điều này là gây tranh cãi (hy vọng nó mang lại cho bạn một số loại huy hiệu "câu trả lời gây tranh cãi" ), nhưng tôi rất vui vì ai đó đã đưa ra quan điểm này. Nhiều người đồng ý với @Martin về điều này! https://dzone.com/articles/principles-creating – pestophagous

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