เมื่อพิจารณาจากคำตอบอื่น ๆ ไม่มีใครนอกจาก@ rob-kennedyได้พูดคุยเกี่ยวกับไฟล์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
ดังนั้นวิธีแก้ปัญหาเฉพาะของ OP คือ
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
โปรดทราบว่าวิธีนี้แทนที่จะตรวจสอบว่ามีการเรียกชื่อเรียกที่เยาะเย้ยผ่านMagicMock.called
คุณสามารถตรวจสอบได้ว่ามีการเรียกด้วยอาร์กิวเมนต์เฉพาะหรือไม่
มีประโยชน์ สมมติว่าคุณต้องการทดสอบฟังก์ชันที่รับรายการและเรียกใช้ฟังก์ชันอื่นcompute()
สำหรับค่าแต่ละค่าของรายการก็ต่อเมื่อฟังก์ชันนั้นเป็นไปตามเงื่อนไขที่กำหนดเท่านั้น
ตอนนี้คุณสามารถเยาะเย้ยcompute
และทดสอบว่ามีการเรียกค่านิยมบางอย่าง แต่ไม่ถูกเรียกใช้กับผู้อื่น