Đánh giá từ các câu trả lời khác, không ai ngoại trừ @ rob-kennedy nói về call_args_list
.
Đây là một công cụ mạnh mẽ để bạn có thể thực hiện ngược lại chính xác với MagicMock.assert_called_with()
call_args_list
là một danh sách các call
đối tượng. Mỗi call
đối tượng đại diện cho một cuộc gọi được thực hiện trên một cuộc gọi giả.
>>> 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)]
Việc sử dụng một call
đối tượng là dễ dàng, vì bạn có thể so sánh nó với một tuple có độ dài 2 trong đó thành phần đầu tiên là một tuple chứa tất cả các đối số vị trí của cuộc gọi liên quan, trong khi thành phần thứ hai là một từ điển của các đối số từ khóa.
>>> ((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
Vì vậy, một cách để giải quyết vấn đề cụ thể của OP là
def test_something():
with patch('something') as my_var:
assert ((some, args),) not in my_var.call_args_list
Lưu ý rằng theo cách này, thay vì chỉ kiểm tra xem có thể gọi được một cuộc gọi giả, thông qua MagicMock.called
, bây giờ bạn có thể kiểm tra xem nó có được gọi với một bộ đối số cụ thể không.
Điều đó hữu ích. Giả sử bạn muốn kiểm tra một chức năng lấy danh sách và gọi một chức năng khác,compute()
, đối với mỗi giá trị của danh sách chỉ khi chúng thỏa mãn một điều kiện cụ thể.
Bây giờ bạn có thể giả compute
, và kiểm tra xem nó đã được gọi trên một số giá trị nhưng không phải trên các giá trị khác.