Tôi muốn khẳng định rằng một classmethod trong một lớp Python gọi một classmethod với một tập hợp các đối số nhất định. Tôi muốn classmethod giả lập là "spec-ed", vì vậy nó phát hiện nếu nó được gọi với số lượng sai các đối số.Làm thế nào để vá classmethod với autospec trong lớp unmocked?
Khi tôi vá lớp học bằng cách sử dụng patch.object(.., autospec=True, ..)
, classmethod được thay thế bằng NonCallableMagicMock
và tăng lỗi khi tôi cố gắng gọi nó.
from mock import patch
class A(object):
@classmethod
def api_meth(cls):
return cls._internal_classmethod(1, 2, 3)
@classmethod
def _internal_classmethod(cls, n, m, o):
return sum(n, m, o)
with patch.object(A, '_internal_classmethod') as p:
print(type(p).__name__)
with patch.object(A, '_internal_classmethod', autospec=True) as p:
print(type(p).__name__)
sản xuất đầu ra:
MagicMock
NonCallableMagicMock
Làm thế nào tôi có thể có được một mô hình đặc tả-ed cho _internal_classmethod
khi lớp nó thuộc về không được chế giễu?
Điều này giải quyết được vấn đề lấy lại một NonCallableMagicMock, nhưng tiếc là không cung cấp hành vi bắt chữ ký cuộc gọi không khớp trên classmethod giả. Hành vi này là quan trọng bởi vì nó bảo vệ chống lại các thử nghiệm giả mạo mà vượt qua mặc dù mã chính nó bị hỏng, có lẽ bằng cách thay đổi chữ ký cuộc gọi của phương pháp. Tôi nghi ngờ rằng hành vi mà tôi đang tìm kiếm là một phần "autospec" và có lẽ giả lập đó vẫn chưa hỗ trợ điều đó. – scanny