পাইথন প্রত্যাবর্তন_মূল্যের পরিবর্তে ম্যাজিকমক অবজেক্ট দেয়


93

আমার কাছে একটি পাইথন ফাইল a.pyরয়েছে যাতে দুটি ক্লাস Aএবং রয়েছে B

class A(object):
    def method_a(self):
        return "Class A method a"

class B(object):
    def method_b(self):
        a = A()
        print a.method_a()

আমি উপহাস করে method_bক্লাসে ইউনিটেট করতে চাই । এই উদ্দেশ্যে ফাইলটির সামগ্রী এখানে দেওয়া হয়েছে :BAtesta.py

import unittest
import mock
import a


class TestB(unittest.TestCase):

    @mock.patch('a.A')
    def test_method_b(self, mock_a):
        mock_a.method_a.return_value = 'Mocked A'
        b = a.B()
        b.method_b()


if __name__ == '__main__':
    unittest.main()

আমি Mocked Aআউটপুট পেতে আশা করি । তবে আমি যা পাই তা হ'ল:

<MagicMock name='A().method_a()' id='4326621392'>

আমি কোথায় ভুল করছি?


4
পরীক্ষার সময়, A()এর return_valueথেকে ফিরে আসে mock_A(একটি নিয়মিত MagicMock, যেমন আপনি অন্য কিছু নির্দিষ্ট করেন নি), যা শ্রেণীর উদাহরণ নয় A। আপনাকে সেটিকে এমন return_valueকিছু হতে হবে যা একটি সংজ্ঞায়িত হয়েছে method_a
জোনারশপে

4
mock_a.method_a.return_value = 'বিদ্রূপিত এ' => উপহাস_এ ()। পদ্ধতি_এ.রেটেন_ভ্যালু = 'মক এ' আরও ভাল হওয়া উচিত :)
আলী সাইদ ওমর

@ অ্যালিসএডোমর হুবহু সঠিক, এটি কলিং থেকে ফেরতের মান mock_aযা পদ্ধতিটি হওয়া উচিত, তা নয় mock_aitself
জোনারশপে

4
@ জোনারশপে তোমার ব্যাখ্যার জন্য ধন্যবাদ. আমি শুধু চেষ্টা করেছি। উভয় mock_a().method_a.return_value = 'Mocked A'এবং mock_a.return_value.method_a.return_value = 'Mocked A'কাজ। আপনার মন্তব্যের জন্য ধন্যবাদ অনেক। আপনি কি দয়া করে এগিয়ে গিয়ে উত্তর হিসাবে রাখবেন?
মেহেদী জাফারনিয়া জহরমি

@ মেহেদী জাফারনিয়া জহরমি অনেক ধন্যবাদ!
নাইক্রস 16

উত্তর:


105

আপনি যখন @mock.patch('a.A'), Aপরীক্ষার অধীনে কোডে ক্লাস প্রতিস্থাপন করা হয় mock_a

ইন B.method_bতারপর আপনি সেট a = A(), যা এখন হয় a = mock_a()- অর্থাৎ aহয় return_valueএর mock_a। আপনি যেমন এই মানটি নির্দিষ্ট করেন নি, এটি নিয়মিত MagicMock; এটি কোনওটি কনফিগার করা হয়নি, সুতরাং MagicMockএটির জন্য পদ্ধতিগুলি কল করার সময় আপনি ডিফল্ট প্রতিক্রিয়া পান (অন্য কোনও )।

পরিবর্তে, আপনি কনফিগার করতে চান এর উপযুক্ত পদ্ধতি, যা আপনি হয় হিসাবে কাজ করতে পারেন আছে:return_valuemock_a

mock_a().method_a.return_value = 'Mocked A' 
    # ^ note parentheses

বা, সম্ভবত আরও স্পষ্টভাবে:

mock_a.return_value.method_a.return_value = 'Mocked A'

আপনার কোডটি ক্ষেত্রে কাজ করে a = A(শ্রেণি নির্ধারণ করে, উদাহরণ তৈরি করে না), a.method_a()ততক্ষণে আপনার মক পদ্ধতিটি ট্রিগার করে।


4
অসাধারণ. আপনি আমার দিন তৈরি করেছেন।
বিশাল

হাই @jonrsharpe, আমি সঙ্গে একটি পান্ডাস dataframe ব্যবহার করছি df.columns আমার চেক করতে যদি শর্ত। এটি প্রথম বন্ধনী ব্যবহার করে না (যেমন এটি কলযোগ্য নয়)। সেক্ষেত্রে একটি তালিকা ফিরিয়ে দিতে আমি কী করব। ধন্যবাদ!
imsrgadich

@ আইমস্রগাদিচ এর জন্য আপনার কি একটি উপহাসের দরকার আছে ? কেবল উপযুক্ত ডেটাফ্রেম তৈরি করুন, এটি একটি পরীক্ষার মান হিসাবে বিবেচনা করুন।
jonrsharpe

@ জোনারশপে হ্যাঁ, আমি এটি করতে পেরেছিলাম তবে আমি আমার ডাকা পদ্ধতিতে ডিএফ.ড্রপোফও সম্পাদন করছি যা আমাকে জোর দেওয়া দরকার এবং তারপরে আমি ডাকাফ্রেমটিকে কল পদ্ধতি থেকে ফিরিয়ে দিচ্ছি না। এটি একটি সমস্যা তৈরি করে। আমি একটি উপায় ব্যবহার করে mock_data.configure_mock(columns='my_column')এটি সমাধান করে found যদিও উত্তর দেওয়ার জন্য ধন্যবাদ। (রেফ: bradmontgomery.net/blog/how-world-do-you-mock-name-attribute )
imsrgadich

আপনি একই পরীক্ষায় দুটি এসকিউএএলএলএকচেমি মডেলকে উপহাস করার সময় এটি কাজ করবে বলে মনে হয় না। প্রথমটি ঠিকঠাক কাজ করে তবে দ্বিতীয়টি আপনি যা নির্দিষ্ট করে তা নির্বিশেষে একটি ম্যাজিকমক ফিরিয়ে দেবে।
জুহা আনটিনেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.