【发布时间】:2012-10-15 21:55:41
【问题描述】:
我正在尝试为具有以下方法的类编写测试:
import datetime
import pytz
class MyClass:
def get_now(self, timezone):
return datetime.datetime.now(timezone)
def do_many_things(self, tz_string='Europe/London'):
tz = pytz.timezone(tz_string)
localtime_now = self.get_now(tz)
...
return things
我想对其进行测试,为此我需要确保 datetime.datetime.now() 调用返回可预测的内容。
我已经阅读了很多在测试中使用 Mock 的示例,但没有找到完全符合我需要的东西,而且我不知道如何在测试中使用它。
我将get_now() 方法分开,以防它更容易模拟,而不是datetime.datetime.now(),但我仍然很难过。关于如何使用 Mock 为此编写 UnitTests 的任何想法? (这一切都在 Django 中,fwiw;我不确定这在这种情况下是否会有所不同。)
【问题讨论】:
-
仅供参考,切勿在 datetime 构造函数中使用 pytz 时区。请改用
localize。 -
谢谢马克。所以我应该做
timezone.localize(datetime.datetime.now())而不是datetime.datetime.now(timezone)?有什么特别好的理由吗? -
有时直接分配时区不能正常工作。一个例子见stackoverflow.com/questions/12808845/…
-
虽然,
localize()只用于幼稚的datetimes。因此,如果now()是 2012-10-26 15:00:00(没有时区),那么它只是将指定的时区应用于它;它不会转换时间。由于我想获得时区的实际时间,我想我需要这样做:datetime.datetime.now(pytz.utc).astimezone(timezone).
标签: python django unit-testing testing mocking