2015-01-15 12 views
6

के साथ आक्रमण किए गए तरीकों के लिए मनमाने ढंग से तर्कों को पास करना मेरे पास एक नकली विधि है। जब इसे कहा जाता है, तो मैं इसे अपने सामान्य व्यवहार को कॉल करने से पहले एक और फ़ंक्शन कॉल करना चाहता हूं। की तरह कुछ:Google सी ++ मॉकिंग फ्रेमवर्क (Google मॉक) (V1.5)

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) 
    .WillOnce(DoAll(
     Invoke(my_obj, &SomeAdditionalMethodIWantToCall), 
     Invoke(my_obj, &DefaultBehavior), 
     )); 

केवल समस्या यह है कि SomeAdditionalMethodIWantToCall पैरामीटर कि सभी MockedMethod के लिए प्रदान की एक से संबंधित नहीं की उम्मीद है। मैं उन्हें देने में सक्षम होना चाहता हूं लेकिन मैं वाक्यविन्यास से जूझ रहा हूं।

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) 
    .WillOnce(DoAll(
     Invoke(my_obj, &SomeAdditionalMethodIWantToCall, arg1, arg2, arg3), 
     Invoke(my_obj, &DefaultBehavior), 
     )); 

मैं किसी भी सफलता के बिना दस्तावेज में ऐसी बात के लिए ध्यान दिया है: मैं वहाँ की तरह कुछ (नकली वाक्य रचना में) था चाहते हैं।

Using a Function or a Functor as an Action में, हमने:

  • Invoke(f), Invoke(object_pointer, &class::method), InvokeWithoutArgs(f), InvokeWithoutArgs(object_pointer, &class::method) जो सिर्फ आगे (या नहीं) मज़ाक उड़ाया कार्य करने के लिए प्रदान की पैरामीटर जब यह कहा जाता है होगा।

  • InvokeArgument<N>(arg1, arg2, ..., argk) पैरामीटर में से किसी एक को कॉल करने के लिए प्रतीत होता है।

Composite Actions

  • WithArg<N>(a) और WithArgs<N1, N2, ..., Nk>(a) में जो मूल समारोह से पैरामीटर अग्रेषित करने के चयन करने के लिए होने लगते हैं।

मुझे लगता है कि मुझे कुछ स्पष्ट याद आ रहा है लेकिन मैं यहां थोड़ा फंस गया हूं इसलिए कोई भी सुझाव मदद करेगा।

उत्तर

5

एक संभावित विकल्प Assign क्रिया का उपयोग करके कक्षा चर के लिए तर्कों के मूल्यों को सहेजना होगा और फिर एक सहायक का उपयोग करके अन्य फ़ंक्शन को आमंत्रित करना होगा। निम्नलिखित उम्मीद का उपयोग करें: इस प्रकार

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) 
    .WillOnce(DoAll(
     Assign(&classVariable1, arg1), 
     Assign(&classVariable2, arg2), 
     Assign(&classVariable3, arg3), 
     InvokeWithoutArgs(my_obj, &MyClass::SomeAdditionalMethodIWantToCallHelper), 
     Invoke(my_obj, &MyClass::DefaultBehavior), 
     )); 

फिर अपने सहायक समारोह को परिभाषित:

void MyClass::SomeAdditionalMethodIWantToCallHelper() 
{ 
    SomeAdditionalMethodIWantToCall(classVariable1, classVariable2, classVariable3); 
} 

संपादित

एक अन्य संभावित विकल्प के लिए एक कस्टम क्रिया है कि एक करने के लिए एक सूचक में लेता है लिखना है उन सदस्यों के साथ सदस्य कार्य करें जिन्हें आप पास करना चाहते हैं। यह सिंटैक्स के लिए मूल रूप से वांछित चीज़ों के करीब है।

ACTION_P5(InvokeUnrelatedFunction, classPointer, pointerToMemberFunc, 
      first, second, third) 
{ 
    (classPointer->*pointerToMemberFunc)(first, second, third); 
} 

करने का तरीका यहां एक उम्मीद में यह प्रयोग करेंगे:: यहाँ कस्टम क्रिया है

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) 
    .WillOnce(DoAll(
     InvokeUnrelatedFunction(my_obj, &MyClass::SomeAdditionalMethodIWantToCall, 
           arg1, arg2, arg3), 
     Invoke(my_obj, &MyClass::DefaultBehavior), 
     )); 
+0

'InvokeUnrelatedFunction' कार्रवाई के साथ, मुझे बस एक कंपाइलर त्रुटि मिलती है जिसमें कहा गया है कि उस बिंदु पर 'arg1' घोषित नहीं किया गया है जहां मैं कार्रवाई का आह्वान करने का प्रयास करता हूं। इसका कारण क्या हो सकता है? – Martin

+0

@ मार्टिन जैसा कि प्रश्न में बताया गया है, 'arg1' एक "पैरामीटर नहीं है जो' MockedMethod' को प्रदान किए गए किसी भी से संबंधित नहीं है।" यदि आप 'MockedMethod' से किसी फ़ंक्शन में तर्क पारित करना चाहते हैं, तो आप केवल' Invoke 'का उपयोग कर सकते हैं। आप 'इनवॉर्क्स' को 'WithArgs' के साथ भी जोड़ सकते हैं, जिसे आप चाहते हैं। उदाहरण के लिए Google मॉक कुकबुक का संदर्भ लें। –

3

आप C++ 11 का उपयोग कर रहे हैं, तो आप इस तरह लैम्ब्डा-कार्यों का उपयोग कर सकते हैं:

EXPECT_CALL(*my_obj, MockedMethod(_,_,_,_,_,_)) 
.WillOnce(DoAll(
    InvokeWithoutArgs([&]() { 
     my_obj->SomeAdditionalMethodIWantToCall(arg1, arg2, arg3); 
    }, 
    Invoke(my_obj, &DefaultBehavior) 
)); 
+0

बहुत सुरुचिपूर्ण! धन्यवाद। –

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