Có một vài vấn đề.
Trước hết, cách bạn đang sử dụng mock.patch
không hoàn toàn đúng. Khi được sử dụng như một trình trang trí, nó thay thế hàm / lớp đã cho (trong trường hợp này datetime.date.today
) bằng một Mock
đối tượng chỉ trong hàm được trang trí . Vì vậy, chỉ trong phạm vi của bạn today()
sẽ datetime.date.today
là một chức năng khác, dường như không phải là những gì bạn muốn.
Những gì bạn thực sự muốn dường như giống như thế này:
@mock.patch('datetime.date.today')
def test():
datetime.date.today.return_value = date(2010, 1, 1)
print datetime.date.today()
Thật không may, điều này sẽ không hoạt động:
>>> test()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "build/bdist.macosx-10.6-universal/egg/mock.py", line 557, in patched
File "build/bdist.macosx-10.6-universal/egg/mock.py", line 620, in __enter__
TypeError: can't set attributes of built-in/extension type 'datetime.date'
Điều này không thành công vì các loại tích hợp Python là bất biến - xem câu trả lời này để biết thêm chi tiết.
Trong trường hợp này, tôi sẽ tự phân lớp datetime.date và tạo hàm đúng:
import datetime
class NewDate(datetime.date):
@classmethod
def today(cls):
return cls(2010, 1, 1)
datetime.date = NewDate
Và bây giờ bạn có thể làm:
>>> datetime.date.today()
NewDate(2010, 1, 1)
mock
thư viện: voidspace.org.uk/python/mock/examples.html#partial-mocking