মোক বনাম ম্যাজিকমক


138

আমার বোধগম্যতা হল যে ম্যাজিকমক হ'ল মক একটি সুপারকেট যা স্বয়ংক্রিয়ভাবে "যাদু পদ্ধতিগুলি" এইভাবে নির্বিঘ্নে তালিকা, পুনরাবৃত্তি ইত্যাদির জন্য সমর্থন সরবরাহ করে ... তবে সরল মকের উপস্থিতির কারণ কী ? এটি কি কেবল ম্যাজিকমকের একটি স্ট্রিপ ডাউন সংস্করণ নয় যা ব্যবহারিকভাবে উপেক্ষা করা যেতে পারে? নেই নকল বর্গ কোন ট্রিকস উপলভ্য নয় জানি MagicMock ?

উত্তর:


99

প্লেইন মক বিদ্যমান থাকার কারণ কী ?

মকের লেখক মাইকেল ফোর্ড পাইকন ২০১১ (৩১:২০) তে খুব অনুরূপ একটি প্রশ্ন করেছিলেন :

প্রশ্ন: ম্যাজিকমককে কেবল ডিফল্ট মক অবজেক্টে দক্ষতা ভাঁজ করার চেয়ে আলাদা জিনিস কেন করা হয়েছিল?

উত্তর: একটি যুক্তিসঙ্গত উত্তর হ'ল ম্যাজিকমক যেভাবে কাজ করে তা হ'ল এটি নতুন মকগুলি তৈরি করে এবং সেগুলি স্থাপন করে এই সমস্ত প্রোটোকল পদ্ধতিগুলিকে পূর্বনির্ধারিত করে, তাই যদি প্রতিটি নতুন উপসাগর একটি নতুন গুটি তৈরি করে এবং সেগুলি প্রোটোকল পদ্ধতি হিসাবে সেট করে এবং সেই সমস্ত প্রোটোকলকে পদ্ধতিগুলি আরও বেশি উপহাস তৈরি করেছে এবং তাদের প্রোটোকল পদ্ধতিগুলিতে সেট করেছে, আপনি অসীম পুনরাবৃত্তি পেয়েছেন ...

যদি আপনি কোনও কনটেইনার বস্তু হিসাবে আপনার মোককে অ্যাক্সেস করতে একটি ত্রুটি হতে চান - আপনি কি এটি কাজ করতে চান না? প্রতিটি মোক যদি প্রতিটি প্রোটোকল পদ্ধতি স্বয়ংক্রিয়ভাবে পেয়ে থাকে তবে তা করা আরও বেশি কঠিন হয়ে যায়। এবং এছাড়াও, ম্যাজিকমক আপনার জন্য এই প্রাক-কনফিগার করার কিছু কাজ করে, রিটার্ন মানগুলি উপযুক্ত নাও করে সেট করে, তাই আমি ভেবেছিলাম যে এই সুবিধাগুলির সাথে আপনার জন্য পূর্বনির্ধারিত এবং উপলভ্য সমস্ত কিছু রয়েছে তবে এটি রাখা ভাল তবে আপনি একটি সাধারণ উপহাসও নিতে পারেন আপনি উপস্থিত থাকতে চান এমন ম্যাজিক পদ্ধতিগুলি অবজেক্ট করুন এবং কনফিগার করুন ...

সহজ উত্তরটি হল: আপনি যদি চান এমন আচরণটি করেন তবে যেকোন জায়গায় কেবল ম্যাজিকমক ব্যবহার করুন।


12
আমি মনে করি এর থেকে ভাল উত্তর হ'ল: আপনি কী করছেন তা যদি আপনি জানেন তবে ম্যাজিকমক ব্যবহার করুন, অন্যথায় মক ব্যবহার করুন।
লাইক

56

মোক দিয়ে আপনি যাদু পদ্ধতিগুলি উপহাস করতে পারেন তবে আপনাকে সেগুলি সংজ্ঞায়িত করতে হবে। ম্যাজিকমকের "বেশিরভাগ ম্যাজিক পদ্ধতির ডিফল্ট বাস্তবায়ন" রয়েছে।

আপনার যদি কোনও যাদু পদ্ধতি পরীক্ষা করার প্রয়োজন না হয় তবে মক পর্যাপ্ত এবং আপনার পরীক্ষায় বহিরাগত জিনিস আনবে না। আপনার যদি প্রচুর যাদু পদ্ধতি পরীক্ষা করার প্রয়োজন হয় তবে ম্যাজিকমক আপনাকে কিছুটা সময় সাশ্রয় করবে।


নিশ্চিতভাবেই আমি ইতিমধ্যে ডকুমেন্টেশন পড়েছি। এটি আমার প্রশ্নের উত্তর দেয় না - যদি ম্যাজিকমোক একই রকম আরও অনেক কিছু করে তবে প্লেইন মককে কেন বিরক্ত করবেন? আমি আমার পরীক্ষায় কোনও বাহ্যিক জিনিস দেখি না - কেবল আলাদা নাম ব্যবহার করুন এবং এটিই that's তাহলে ধরা কোথায়?
ভ্লাদিমির Ignatov

39
পরীক্ষাগুলি ন্যূনতম হওয়া উচিত এবং মক অবজেক্টগুলি ন্যূনতম কার্যকরভাবে হওয়া উচিত যাতে আপনি ঠিক কী পরীক্ষা করছেন তা নিশ্চিত। আপনি যদি ম্যাজিকমক ব্যবহার করেন তবে এটি আরও বেশি করে তবে আপনি ডিফল্ট ম্যাজিকমকের আচরণের কারণে পরীক্ষায় ব্যর্থ হওয়ার ঝুঁকি নিয়ে স্পষ্টভাবে পরীক্ষা করছেন না। এই ব্যর্থতা ম্যাজিকমকের ডিফল্ট সম্পর্কে কিছু উপস্থাপন করতে পারে যা এটি উপহাস করার কথা। আরও খারাপ, আপনি যখন পরীক্ষাটি ব্যর্থ হওয়া উচিত তখন সফল হওয়ার ঝুঁকিটি চালান । ঝুঁকি কম তবে এটি যদি হয় তবে এটি আপনার অনেক সময় নষ্ট করবে।
শান রেডমন্ড

1
আমি এটিকে প্লেইন জেএস বনাম জ্যাকুয়েরি ব্যবহারের মতো ভাবি। অবশ্যই, আপনি আপনার সমস্ত জেএস করতে জ্যাকুরিটিকে ব্যবহার করতে পারেন তবে কিছু ক্ষেত্রে, আপনি কাজটি সেরে নিতে খুব ন্যূনতম সরঞ্জামটি ব্যবহার করতে চান। আমি দেখতে পাই যে মামলাগুলি সাধারণত হয় অত্যন্ত সাধারণ বা অত্যন্ত জটিল।
snuggles

49

শুরু করার জন্য, MagicMockএর একটি সাবক্লাস Mock

class MagicMock(MagicMixin, Mock)

ফলস্বরূপ, ম্যাজিকমক মক সরবরাহ করে এবং আরও অনেক কিছু সরবরাহ করে। মককে ম্যাজিকমকের স্ট্রিপড ডাউন সংস্করণ হিসাবে ভাবার পরিবর্তে ম্যাজিকমকে মকের একটি বর্ধিত সংস্করণ হিসাবে ভাবেন। এটি মক কেন বিদ্যমান এবং ম্যাক ম্যাজিকমকের শীর্ষে কী সরবরাহ করে সে সম্পর্কে আপনার প্রশ্নের সমাধান করা উচিত।

দ্বিতীয়ত, MagicMock অনেক / সর্বাধিক যাদু পদ্ধতিগুলির ডিফল্ট প্রয়োগকরণ সরবরাহ করে, তবে মক তা করেন না। প্রদত্ত যাদু পদ্ধতি সম্পর্কে আরও তথ্যের জন্য এখানে দেখুন ।

প্রদত্ত যাদু পদ্ধতির কয়েকটি উদাহরণ:

>>> int(Mock())
TypeError: int() argument must be a string or a number, not 'Mock'
>>> int(MagicMock())
1
>>> len(Mock())
TypeError: object of type 'Mock' has no len()
>>> len(MagicMock())
0

এবং এগুলি যেহেতু স্বজ্ঞাত হতে পারে না (অন্তত আমার কাছে স্বজ্ঞাত নয়):

>>> with MagicMock():
...     print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>

এই পদ্ধতিগুলি প্রথমবারের মতো আহ্বান করা হওয়ায় আপনি ম্যাজিকমকে যুক্ত পদ্ধতিগুলি "দেখতে" পারেন:

>>> magic1 = MagicMock()
>>> dir(magic1)
['assert_any_call', 'assert_called_once_with', ...]
>>> int(magic1)
1
>>> dir(magic1)
['__int__', 'assert_any_call', 'assert_called_once_with', ...]
>>> len(magic1)
0
>>> dir(magic1)
['__int__', '__len__', 'assert_any_call', 'assert_called_once_with', ...]

তো, কেন সব সময় ম্যাজিকমক ব্যবহার করবেন না?

আপনার কাছে ফিরে প্রশ্নটি: আপনি কি ডিফল্ট যাদু পদ্ধতি প্রয়োগের সাথে ঠিক আছেন? উদাহরণস্বরূপ, mocked_object[1]ত্রুটি না করা কি ঠিক আছে ? ইতিমধ্যে যাদু পদ্ধতি বাস্তবায়নের কারণে কোনও অনিচ্ছাকৃত পরিণতিতে আপনি কি ঠিক আছেন?

যদি এই প্রশ্নের উত্তর হ্যাঁ হয়, তবে এগিয়ে যান এবং ম্যাজিকমক ব্যবহার করুন। তা না হলে মোককে আঁকড়ে থাকুন।


12

পাইথনের অফিসিয়াল ডকুমেন্টেশন এটাই বলে:

এগুলির বেশিরভাগ উদাহরণে মক এবং ম্যাজিকমক ক্লাসগুলি বিনিময়যোগ্য। ম্যাজিকমকটি আরও সক্ষম শ্রেণীর হিসাবে এটি বুদ্ধিমানকে ডিফল্টরূপে ব্যবহার করতে সক্ষম করে।


3

আমি আরও একটি বিশেষ কেস পেয়েছি যেখানে সাধারণ এর Mock চেয়ে আরও কার্যকর হতে পারে MagicMock:

In [1]: from unittest.mock import Mock, MagicMock, ANY
In [2]: mock = Mock()
In [3]: magic = MagicMock()
In [4]: mock.foo == ANY
Out[4]: True
In [5]: magic.foo == ANY
Out[5]: False

বিরুদ্ধে তুলনা করা ANY করা কার্যকর হতে পারে, উদাহরণস্বরূপ, প্রায় প্রতিটি কীকে দুটি অভিধানের মধ্যে তুলনা করা যেখানে একটি মান ব্যবহার করে কিছু মান গণনা করা হয়।

আপনি যদি ব্যবহার করছেন তবে এটি বৈধ হবে Mock:


self.assertDictEqual(my_dict, {
  'hello': 'world',
  'another': ANY
})

AssertionErrorআপনি যদি এটি ব্যবহার করেন তবে এটি উত্থাপন করবেMagicMock

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