2013-06-21 7 views
7

मैं एक वर्ग है कि एक संदर्भ पैरामीटर के रूप में एक बूलियन लेता है और एक पूर्णांक रिटर्न:गूगल नकली ByRef विधि

class Foo 
{ 
    public: 
    Bar my_bar; 
    virtual int myMethod(bool &my_boolean) = 0; 
} 

/*...*/ 

int Foo::myMethod(bool &my_boolean){ 
    if (my_bar == NULL){ 
    my_boolean = false; 
    return -1; 
    } 
    else{ 
    my_boolean = true; 
    return 0; 
    } 

} 

और मैं इस वर्ग के लिए एक नकली बनाया:

class MockFoo : public Foo 
{ 
    MOCK_METHOD1(myMethod,int(bool &my_boolean)); 
} 

मैं कैसे समारोह के इस प्रकार के लिए अपेक्षाएं सेट करने के बारे में समस्या हो रही है, क्योंकि मैं वापसी मान और ठीक से मेरी इकाई बनाने के लिए tests.How मैं gmock साथ समारोह के इस प्रकार के साथ सौदा कर सकते हैं विशिष्ट मूल्यों के संदर्भ पैरामीटर निर्धारित करने की आवश्यकता? मैंने जो कुछ सोचा था उसके बाद मैंने कोशिश की प्रलेखन पर समाधान के रूप में:

using ::testing::SetArgPointee; 

class MockMutator : public Mutator { 
    public: 
    MOCK_METHOD2(Mutate, void(bool mutate, int* value)); 
    ... 
}; 
    ... 

MockMutator mutator; 
EXPECT_CALL(mutator, Mutate(true, _)) 
    .WillOnce(SetArgPointee<1>(5)); 

लेकिन या तो मैं उदाहरण से समझा नहीं गया था या यह पहले स्थिति इस तरह का whith निपटा इस case.Has किसी के लिए भी लागू नहीं किया गया?

अग्रिम धन्यवाद।

+0

तब मैं आपके सवाल का क्या नहीं मिलता है। क्या आप अपनी समस्याओं का विस्तार कर सकते हैं? कोड मेरे लिए सही प्रतीत होता है। या आप जानना चाहते हैं कि संदर्भ पैरामीटर के लिए अपेक्षाओं को कैसे सेट करना है? 'ByRef() 'इसके लिए बिल्कुल ठीक होगा। –

+0

+1 जो कुक पुस्तक के उदाहरणों से प्राप्त करना मुश्किल है। –

उत्तर

6

आपका प्रश्न प्राप्त करने के लिए कठिन है! Google mocks 'cook book' के नमूने भी हैं।

क्या आप नकली कक्षा के साथ Foo::myMethod() के लिए कार्यान्वयन का पुन: उपयोग करना चाहते हैं, या आप विशिष्ट कॉल स्थितियों के लिए साइड इफेक्ट्स (रिटर्न वैल्यू और रेफ पैरामीटर द्वारा बदला गया) का नकल करना चाहते हैं?

एक नकली वर्ग आम तौर पर बदलने के लिए/अनुकरण अपने Foo वर्ग, यह सीधे वारिस के लिए नहीं होती है या यह व्यवहार है। यह नहीं पता कि शुद्ध विधि के लिए इस 'डिफ़ॉल्ट' व्यवहार को परिभाषित करने का तरीका काम करेगा, लेकिन संदेह है कि। आप बस = 0 को छोड़ सकते हैं। बेहतर दृष्टिकोण की तरह एक असली इंटरफेस घोषणा को अलग करने के होगा:

struct IFoo 
{ 
    virtual int myMethod(bool &my_boolean) = 0; 
    virtual ~IFoo() {} 
}; 

class Foo : public IFoo 
{ 
    // ... 
}; 

class MockFoo : public IFoo 
{ 
    MOCK_METHOD1(myMethod,int(bool &my_boolean)); 
}; 

आप बाद के मामले है, तो आप testing::Return(value) और testing::SetArgReferee<N>(value) साथ उतरना चाहिए (में पाया गया कि बहुत उपयोगी 'Cheat Sheet' में)।

आपका उम्मीद कॉल यह तो तरह दिखना चाहिए:

MockFoo foo; 

// Expect call to myMethod() return -1 and set the by ref argument to true 
EXPECT_CALL(foo, myMethod(_)) 
    .WillOnce(DoAll(SetArgReferee<0>(true),Return(-1))); 

// Expect call to myMethod() return 0 and set the by ref argument to false 
EXPECT_CALL(foo, myMethod(_)) 
    .WillOnce(DoAll(SetArgReferee<0>(false),Return(0))); 

तुम सच में अपने मूल वर्गों तर्क पुन: उपयोग करने myMethod()'Delegating calls to a parent class', resp पर एक नजर है के लिए चाहते हैं। 'Delegating Calls to a Real Object'

+0

क्षमा करें @ जी makulik मैं प्रतिलिपि चिपकाया गलत कोड-टुकड़ा, कि एक संबंधित नहीं था करने के लिए इस question.I've अब यह सही था। –

+0

क्षमा भी, यह मेरे समय का एक सा ले लिया आपकी समस्या यह पता लगाने की। 'ByRef()' इस मामले के लिए झूठा रास्ता था। –

+0

@RodrigoVasconcelos अब रुचि नहीं है? क्या यह आपकी समस्याओं का समाधान करता है? –

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