มีปัญหาเล็กน้อย
ก่อนอื่นวิธีที่คุณใช้mock.patch
ไม่ถูกต้อง เมื่อใช้เป็นมัณฑนากรจะแทนที่ได้รับฟังก์ชั่น / คลาส (ในกรณีนี้datetime.date.today
) โดยมีMock
วัตถุเฉพาะภายในฟังก์ชั่นการตกแต่ง ดังนั้นเฉพาะภายในคุณเท่านั้นที่today()
จะdatetime.date.today
มีฟังก์ชั่นที่แตกต่างกันซึ่งไม่ปรากฏว่าเป็นสิ่งที่คุณต้องการ
สิ่งที่คุณต้องการดูเหมือนจะเป็นแบบนี้มากขึ้น:
@mock.patch('datetime.date.today')
def test():
datetime.date.today.return_value = date(2010, 1, 1)
print datetime.date.today()
น่าเสียดายที่วิธีนี้ใช้ไม่ได้:
>>> 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'
สิ่งนี้ล้มเหลวเนื่องจากชนิดในตัวของ Python ไม่เปลี่ยนรูป - ดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม
ในกรณีนี้ฉันจะ subclass datetime.date ตัวเองและสร้างฟังก์ชั่นที่เหมาะสม:
import datetime
class NewDate(datetime.date):
@classmethod
def today(cls):
return cls(2010, 1, 1)
datetime.date = NewDate
และตอนนี้คุณสามารถทำได้:
>>> datetime.date.today()
NewDate(2010, 1, 1)
mock
ห้องสมุด: voidspace.org.uk/python/mam/examples.html#partial-mocking