Để bắt đầu, MagicMock
là một lớp con của Mock
.
class MagicMock(MagicMixin, Mock)
Do đó, MagicMock cung cấp mọi thứ mà Mock cung cấp và hơn thế nữa. Thay vì nghĩ về Mock như là một phiên bản rút gọn của MagicMock, hãy nghĩ về MagicMock như một phiên bản mở rộng của Mock. Điều này sẽ giải quyết các câu hỏi của bạn về lý do tại sao Mock tồn tại và Mock cung cấp những gì trên MagicMock.
Thứ hai, MagicMock cung cấp các triển khai mặc định của nhiều / hầu hết các phương thức ma thuật, trong khi Mock thì không. Xem ở đây để biết thêm thông tin về các phương pháp ma thuật được cung cấp.
Một số ví dụ về các phương pháp ma thuật được cung cấp:
>>> int(Mock())
TypeError: int() argument must be a string or a number, not 'Mock'
>>> int(MagicMock())
1
>>> len(Mock())
TypeError: object of type 'Mock' has no len()
>>> len(MagicMock())
0
Và những thứ có thể không trực quan (ít nhất là không trực quan với tôi):
>>> with MagicMock():
... print 'hello world'
...
hello world
>>> MagicMock()[1]
<MagicMock name='mock.__getitem__()' id='4385349968'>
Bạn có thể "thấy" các phương thức được thêm vào MagicMock khi các phương thức đó được gọi lần đầu tiên:
>>> magic1 = MagicMock()
>>> dir(magic1)
['assert_any_call', 'assert_called_once_with', ...]
>>> int(magic1)
1
>>> dir(magic1)
['__int__', 'assert_any_call', 'assert_called_once_with', ...]
>>> len(magic1)
0
>>> dir(magic1)
['__int__', '__len__', 'assert_any_call', 'assert_called_once_with', ...]
Vậy, tại sao không sử dụng MagicMock mọi lúc?
Câu hỏi trở lại với bạn là: Bạn có ổn với việc triển khai phương thức ma thuật mặc định không? Ví dụ, nó có ổn mocked_object[1]
để không lỗi không? Bạn có ổn với bất kỳ hậu quả ngoài ý muốn do việc triển khai phương pháp ma thuật đã có không?
Nếu câu trả lời cho những câu hỏi này là có, thì hãy tiếp tục và sử dụng MagicMock. Nếu không, dính vào Mock.