अन्य जवाबों को देखते हुए, @ लूट-केनेडी को छोड़कर किसी ने भी इस बारे में बात नहीं की call_args_list
।
यह एक शक्तिशाली उपकरण है जिसके लिए आप इसके ठीक विपरीत लागू कर सकते हैं MagicMock.assert_called_with()
call_args_list
call
वस्तुओं की एक सूची है । प्रत्येक 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
, और परीक्षण कर सकते हैं कि क्या इसे कुछ मूल्य पर बुलाया गया है, लेकिन दूसरों पर नहीं।