আমাকে সর্বদা সময় এবং সময়টিকে একবার দেখতে হবে, তাই আমার উত্তর এখানে is
একই শ্রেণীর বিভিন্ন অবজেক্টে একাধিক পদ্ধতি কল আহ্বান করা
মনে করুন আমাদের একটি ভারী দায়িত্বের ক্লাস রয়েছে (যা আমরা উপহাস করতে চাই):
In [1]: class HeavyDuty(object):
...: def __init__(self):
...: import time
...: time.sleep(2) # <- Spends a lot of time here
...:
...: def do_work(self, arg1, arg2):
...: print("Called with %r and %r" % (arg1, arg2))
...:
এখানে কিছু কোড যা HeavyDuty
শ্রেণীর দুটি উদাহরণ ব্যবহার করে :
In [2]: def heavy_work():
...: hd1 = HeavyDuty()
...: hd1.do_work(13, 17)
...: hd2 = HeavyDuty()
...: hd2.do_work(23, 29)
...:
এখন, heavy_work
ফাংশনটির জন্য এখানে একটি পরীক্ষার কেস দেওয়া হয়েছে :
In [3]: from unittest.mock import patch, call
...: def test_heavy_work():
...: expected_calls = [call.do_work(13, 17),call.do_work(23, 29)]
...:
...: with patch('__main__.HeavyDuty') as MockHeavyDuty:
...: heavy_work()
...: MockHeavyDuty.return_value.assert_has_calls(expected_calls)
...:
আমরা HeavyDuty
ক্লাস নিয়ে ঠাট্টা করছি MockHeavyDuty
। প্রতিটি ইভেন্ট থেকে আগত পদ্ধতি কলগুলি জোড় করার HeavyDuty
জন্য আমাদের MockHeavyDuty.return_value.assert_has_calls
পরিবর্তে উল্লেখ করতে হবে MockHeavyDuty.assert_has_calls
। তদতিরিক্ত, তালিকায় expected_calls
আমাদের কোন পদ্ধতির নামটি কল করতে আগ্রহী তা নির্দিষ্ট করতে হবে। সুতরাং আমাদের তালিকা কল থেকে তৈরি করা হয়েছে call.do_work
, কেবল বিপরীতে call
।
পরীক্ষার কেসটি অনুশীলন করা আমাদের দেখায় যে এটি সফল:
In [4]: print(test_heavy_work())
None
আমরা যদি heavy_work
ফাংশনটি সংশোধন করি তবে পরীক্ষাটি ব্যর্থ হয় এবং একটি সহায়ক ত্রুটি বার্তা উত্পন্ন করে:
In [5]: def heavy_work():
...: hd1 = HeavyDuty()
...: hd1.do_work(113, 117) # <- call args are different
...: hd2 = HeavyDuty()
...: hd2.do_work(123, 129) # <- call args are different
...:
In [6]: print(test_heavy_work())
---------------------------------------------------------------------------
(traceback omitted for clarity)
AssertionError: Calls not found.
Expected: [call.do_work(13, 17), call.do_work(23, 29)]
Actual: [call.do_work(113, 117), call.do_work(123, 129)]
একটি ফাংশনে একাধিক কল জোর দেওয়া
উপরের সাথে বিপরীতে, এখানে একটি উদাহরণ যা দেখায় যে কোনও ফাংশনে একাধিক কলকে কীভাবে উপহাস করা যায়:
In [7]: def work_function(arg1, arg2):
...: print("Called with args %r and %r" % (arg1, arg2))
In [8]: from unittest.mock import patch, call
...: def test_work_function():
...: expected_calls = [call(13, 17), call(23, 29)]
...: with patch('__main__.work_function') as mock_work_function:
...: work_function(13, 17)
...: work_function(23, 29)
...: mock_work_function.assert_has_calls(expected_calls)
...:
In [9]: print(test_work_function())
None
দুটি প্রধান পার্থক্য আছে। প্রথমটি হ'ল কোনও ফাংশনটিকে উপহাস করার সময় আমরা ব্যবহারের call
পরিবর্তে আমাদের প্রত্যাশিত কলগুলি সেটআপ করি call.some_method
। দ্বিতীয় যে আমরা কল assert_has_calls
উপর mock_work_function
পরিবর্তে উপর, mock_work_function.return_value
।