Khi lần đầu tiên gặp phải vấn đề này, tôi thường gồng mình lên hàng giờ liền. Tôi đã tìm thấy một cách dễ dàng hơn nhiều để xử lý điều này.
Điều này sẽ hoàn toàn vượt qua trình trang trí, giống như mục tiêu thậm chí không được trang trí ngay từ đầu.
Điều này được chia thành hai phần. Tôi đề nghị đọc bài viết sau.
http://alexmarandon.com/articles/python_mock_gotchas/
Hai Gotcha mà tôi liên tục gặp phải:
1.) Giả lập Trình trang trí trước khi nhập chức năng / mô-đun của bạn.
Các trình trang trí và chức năng được xác định tại thời điểm mô-đun được tải. Nếu bạn không mô phỏng trước khi nhập, nó sẽ bỏ qua mô hình đó. Sau khi tải, bạn phải thực hiện một mock.patch.object kỳ lạ, điều này thậm chí còn khó chịu hơn.
2.) Đảm bảo rằng bạn đang mô phỏng đường dẫn chính xác đến người trang trí.
Hãy nhớ rằng bản vá của trình trang trí mà bạn đang chế nhạo dựa trên cách mô-đun của bạn tải trình trang trí, chứ không phải cách thử nghiệm của bạn tải trình trang trí. Đây là lý do tại sao tôi khuyên bạn nên luôn sử dụng đường dẫn đầy đủ để nhập. Điều này làm cho mọi thứ dễ dàng hơn rất nhiều để kiểm tra.
Các bước:
1.) Chức năng Mock:
from functools import wraps
def mock_decorator(*args, **kwargs):
def decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
return f(*args, **kwargs)
return decorated_function
return decorator
2.) Chế giễu người trang trí:
2a.) Đường dẫn bên trong với.
with mock.patch('path.to.my.decorator', mock_decorator):
from mymodule import myfunction
2b.) Bản vá ở đầu tệp hoặc trong TestCase.setUp
mock.patch('path.to.my.decorator', mock_decorator).start()
Một trong hai cách này sẽ cho phép bạn nhập chức năng của mình bất cứ lúc nào trong TestCase hoặc phương pháp / trường hợp thử nghiệm của nó.
from mymodule import myfunction
2.) Sử dụng một chức năng riêng biệt như một tác dụng phụ của mock.patch.
Bây giờ bạn có thể sử dụng mock_decorator cho mỗi trang trí mà bạn muốn mô phỏng. Bạn sẽ phải giả từng người trang trí riêng biệt, vì vậy hãy để ý những người bạn bỏ sót.