অন্যান্য উত্তরগুলি বিবেচনা করে, @ রব-কেনেডি ছাড়া আর কেউই এই বিষয়ে কথা বলেনিcall_args_list ।
এটি একটি শক্তিশালী সরঞ্জাম যার জন্য আপনি ঠিক এর বিপরীতটি বাস্তবায়ন করতে পারেন MagicMock.assert_called_with()
call_args_listcallবস্তুর একটি তালিকা । প্রতিটি callবস্তু একটি উপহাসযুক্ত কল করার জন্য করা কলকে উপস্থাপন করে।
>>> from unittest.mock import MagicMock
>>> m = MagicMock()
>>> m.call_args_list
[]
>>> m(42)
<MagicMock name='mock()' id='139675158423872'>
>>> m.call_args_list
[call(42)]
>>> m(42, 30)
<MagicMock name='mock()' id='139675158423872'>
>>> m.call_args_list
[call(42), call(42, 30)]
কোনও callবস্তু গ্রহণ করা সহজ, যেহেতু আপনি এটির দৈর্ঘ্য 2 এর একটি দ্বিগুণের সাথে তুলনা করতে পারেন যেখানে প্রথম উপাদানটি সম্পর্কিত কলটির সমস্ত অবস্থানগত আর্গুমেন্ট সমেত একটি টুপল, যখন দ্বিতীয় উপাদানটি মূলশব্দ যুক্তিগুলির একটি অভিধান।
>>> ((42,),) in m.call_args_list
True
>>> m(42, foo='bar')
<MagicMock name='mock()' id='139675158423872'>
>>> ((42,), {'foo': 'bar'}) in m.call_args_list
True
>>> m(foo='bar')
<MagicMock name='mock()' id='139675158423872'>
>>> ((), {'foo': 'bar'}) in m.call_args_list
True
সুতরাং, ওপির নির্দিষ্ট সমস্যাটি সমাধানের একটি উপায়
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
মনে রাখবেন যে এই উপায়ে, কোনও উপহাসযুক্ত কলটি কল করা হয়েছে কিনা তা পরীক্ষা করার পরিবর্তে MagicMock.called , আপনি এখন এটি নির্দিষ্ট আর্গুমেন্টের সাহায্যে কল করা হয়েছে কিনা তা পরীক্ষা করে দেখতে পারেন।
এটি দরকারী। বলুন যে আপনি কোনও ফাংশন পরীক্ষা করতে চান যা একটি তালিকা গ্রহণ করে এবং অন্য ফাংশনটিতে কল করে,compute() কেবলমাত্র তালিকাটির প্রতিটি মানের জন্য যদি তারা একটি নির্দিষ্ট শর্তটি পূরণ করে তবে।
আপনি এখন উপহাস করতে পারেন computeএবং পরীক্ষা করতে পারেন যদি এটির কোনও মূল্য দেওয়া হয় তবে অন্যের কাছে নয়।