मैं एक ऐसे मुद्दे में भाग रहा हूं जहां मैं एक ही फ़ंक्शन कॉल को कई अलग-अलग परीक्षणों में GMOCK ऑब्जेक्ट पर कॉल कर रहा हूं। अपेक्षित कॉल हमेशा समान होती है। हालांकि, केवल पहला परीक्षण वास्तविक कॉल के साथ अपेक्षित कॉल का मिलान करेगा। बाद के परीक्षण जो समान अपेक्षित कॉल करते हैं, इसके बजाय निम्न संदेश के साथ विफल हो जाएंगे:

अप्रत्याशित नकली फ़ंक्शन कॉल - डिफ़ॉल्ट मान लौटा रहा है। फ़ंक्शन कॉल: getNewTempAccountSlot(@0xaddrs 4-बाइट ऑब्जेक्ट ) नकली फ़ंक्शन में कोई डिफ़ॉल्ट क्रिया सेट नहीं है, और इसके रिटर्न प्रकार में कोई डिफ़ॉल्ट डिफ़ॉल्ट मान सेट नहीं है।

तो, यहां क्या हो रहा है इसका एक कोड उदाहरण है, यहां बताया गया है कि मैं अपनी स्थिरता कैसे स्थापित करता हूं।

struct fixture
{
    Payment *MOCK_payment;

    NiceMock<GMOCK_AccountDatabase_I*> *MOCK_accountDatabase = new NiceMock<GMOCK_AccountDatabase_I()>;
    std::shared_ptr<GMOCK_AccountDatabase_I> MOCK_accountDatabaseSharedPtr = std::shared_ptr<NiceMock<GMOCK_AccountDatabase_I>>(MOCK_accountDatabase);

    std::shared_ptr<GMOCK_ClientAccount_I> MOCK_clientAccount;

    TransactionProcessor testTransactionProcessor;

   Fixture()
   : testTransactionProcessor(MOCK_accountDatabaseSharedPtr),
     MOCK_clientAccount(std::make_shared<GMOCK_ClientAccount_I>())
   {
       MOCK_payment = new Payment();
   }
   ~Fixture()
   {
       delete MOCK_payment;
       MOCK_payment = 0;

       Mock::VerifyAndClearExpectations(MOCK_clientAccount.get());
   }

   setPaymentData(ClientAccountType acc_type)
   {
       MOCK_payment->paymentData.account_type = acc_type;
   }
}

और यहां बताया गया है कि मैं अपने परीक्षणों का मूल्यांकन कैसे करता हूं

TEST(TransactionProcessorTest, New_Automatic_Payment)
{
    Fixture f;
    f.setPaymentData(AccountTypes::ACC_DEFAULT);

    InSequence s1;

    EXPECT_CALL(*f.MOCK_accountDatabase, getNewTempAccountSlot(AccountTypes::ACC_DEFAULT)).WillOnce(Return(f.MOCK_clientAccount);

    f.testTransactionProcessor.processPayment(*f.payment);
}



TEST(TransactionProcessorTest, New_Manual_Payment)
{
    Fixture f;
    f.setPaymentData(AccountTypes::ACC_DEFAULT);

    InSequence s1;

    EXPECT_CALL(*f.MOCK_accountDatabase, getNewTempAccountSlot(AccountTypes::ACC_DEFAULT)).WillOnce(Return(f.MOCK_clientAccount);

    f.testTransactionProcessor.processPayment(*f.payment);
}

अंत में, यहाँ स्रोत कोड है:

void AccountDatabase::processPayment(AccountTypes type)
{
    std::shared_ptr<ClientAccount_I> temp_client_account = nullptr;
    temp_client_account = AccountDatabasePtr->getNewTempAccountSlot(type);

    if(temp_client_account != nullptr){
    ...
    }
}

मैं वास्तव में काफी उलझन में हूं क्योंकि यह पहचानता है कि पहली बार इसमें किस वस्तु को पारित किया जा रहा है। मैं वास्तव में परीक्षणों को पुन: व्यवस्थित कर सकता हूं और यह हमेशा पहले परीक्षण में उत्तीर्ण होगा और बाकी के लिए असफल हो जाएगा। क्या कोई इस बारे में कोई अंतर्दृष्टि प्रदान कर सकता है कि मैं इस मुद्दे को कैसे रोक सकता हूं? आपके धैर्य के लिए अग्रिम में आपका शुक्रिया।

-1
Don 1 पद 2018, 01:31

1 उत्तर

सबसे बढ़िया उत्तर

ठीक है, मैं अपने स्वयं के प्रश्न का उत्तर दे रहा हूं क्योंकि मैंने इसे अभी समझ लिया है और यदि कोई और इससे सीख सकता है तो मुझे आशा है कि वे मेरी मूर्खता का लाभ उठा सकते हैं।

मूल रूप से, मैंने आकलन किया कि मेरा f.setPaymentData(AccountType type) खाता प्रकार एनम के लिए डेटा सेट कर रहा था। मैंने ऐसा इसलिए किया क्योंकि पहला परीक्षण पास! (वह और क्योंकि वास्तविक डेटा में बहुत अधिक फ़ील्ड हैं और मैंने इसे देखा)। लेकिन जैसा कि यह निकला, मैं नहीं था! मुझे यकीन नहीं है कि पहला Google नकली उम्मीद कॉल क्यों पास हुआ लेकिन जब मैंने डेटा सेट किया, तो बाकी भी पास होने लगे। मैं इस उम्मीद में हूँ की इससे मदद मिलेगी।

(मुझे यह भी यकीन नहीं है कि इसे डाउन वोट क्यों दिया गया था, अगर मैं कुछ गलत कर रहा हूं, तो मैं हमेशा अंतर्दृष्टि की सराहना करता हूं कि मैं बेहतर कैसे कर सकता हूं, चीयर्स)

0
Don 30 नवम्बर 2018, 22:51