2010-03-07 12 views
24

मैंने सुना है कि Google-test TestCase क्लासेस मित्रों को मेरी कक्षाओं में सक्षम करने की संभावना है, इस प्रकार परीक्षण मेरे निजी/संरक्षित सदस्यों तक पहुंचने में सक्षम बनाता है।मेरी कक्षाओं के साथ Google-test क्लासेस दोस्त कैसे बनाएं?

इसे कैसे पूरा करें?

उत्तर

26

(सीधे Google परीक्षा डॉक्स से ...) इस प्रयास करें:

FRIEND_TEST(TestCaseName, TestName); 

उदाहरण के लिए:

// 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

उदाहरण के लिए मेरे पास एक और परीक्षण है BarReturnsOneOnSth। क्या मुझे उस परीक्षा के लिए एक और एफआरआई END_TEST घोषणा भी जोड़नी है? – pajton

+1

हां। प्रत्येक परीक्षण तकनीकी रूप से एक वर्ग है, और आपको एक समय में उनसे मित्रता करने की आवश्यकता है। – hobbit

+15

मैं इसे ऐसे तरीके से कैसे कर सकता हूं जो मुझे 'Foo'' के साथ हेडर फ़ाइल में googletest शीर्षलेख फ़ाइलों को शामिल करने के लिए मजबूर नहीं करता है? –

19

मैं जानता हूँ कि इस पुरानी है, लेकिन मैं आज एक ही जवाब के लिए खोज रहा था। "gtest_prod.h" परीक्षण कक्षाओं के संदर्भ में बस एक साधारण मैक्रो प्रस्तुत करता है।

friend class FooTest_BarReturnsZeroOnNull_Test; 

यह काम करता है क्योंकि प्रत्येक परीक्षा अपने ही वर्ग पिछले जवाब में बताया गया है:

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

तो FRIEND_TEST(FooTest, BarReturnsZeroOnNull); के बराबर है।

+0

@DaveRuske कृपया अपने संपादन में स्वयं को संपादित न करें। संपादन सारांश के लिए यही है। यदि समस्या 6 वर्ण सीमा है, तो आप शरीर में कहीं भी ' 'जोड़ सकते हैं (' ' एक टिप्पणी है और इसलिए दिखाई नहीं देगी)। –

0

एक बेहतर बेहतर रणनीति है कि आप अपने यूनिट परीक्षणों के बीच मित्र परीक्षणों की अनुमति न दें।

निजी सदस्यों तक पहुंचने वाले मित्र परीक्षणों को अनुमति देने से कोड आधार बन जाएगा जो बनाए रखना मुश्किल है। जब भी किसी घटक के आंतरिक कार्यान्वयन विवरण को दोबारा शुरू किया जाता है तो वह टेस्ट नहीं होता है जो आप चाहते हैं। यदि अतिरिक्त प्रयास इसके बजाय एक डिज़ाइन प्राप्त करने में लगाया जाता है जहां घटकों को उनके सार्वजनिक इंटरफ़ेस के माध्यम से परीक्षण किया जा सकता है, तो आपको ऐसे परीक्षण मिलेंगे जिन्हें किसी घटक के सार्वजनिक इंटरफ़ेस को अद्यतन होने पर अपडेट करने की आवश्यकता होती है।

gtest/gtest_prod.h पर निर्भर टेस्ट खराब डिजाइन के संकेत के रूप में देखा जाना चाहिए।

+1

मैं समझता हूं कि यह विवादास्पद है (उम्मीद है कि यह आपको किसी प्रकार का "विवादास्पद उत्तर" बैज अर्जित करता है), लेकिन मुझे खुशी है कि कोई इस दृष्टिकोण को लाया है। इस पर @ मार्टिन से कई सहमत हैं! https://dzone.com/articles/principles-creating – pestophagous

संबंधित मुद्दे