其他人解释了为什么编写依赖于当前时间的测试不是一个好主意(例如,不可重现的错误,并且无法测试特殊日期,例如夏令时)。因此,在测试序列化程序时,我使用了以下模式:
def test_should_be_valid_if_best_before_a_future_date(self) -> None:
serializer = MyModel(
data={
'best_before': datetime.datetime(…),
…
},
context={'now': datetime.datetime(…)},
)
self.assertTrue(serializer.is_valid())
例如,best_before
在现在之前,现在和之后,这种模式使得测试发生的情况变得很简单。
我没有找到类似的过滤器模式-它们似乎没有context
属性。我将如何对过滤器进行类似的测试,理想情况下无需模拟任何内容,因为这会使测试取决于实现细节?
答案 0 :(得分:0)
我通常不模拟时间,但是当我使用freezegun时:
from datetime import datetime
from freezegun import freeze_time
@freeze_time("2019-01-21 01:00:00")
def test_time():
assert datetime.now() == datetime(2019, 1, 21, 1, 0, 0)
理想情况下,在日期时间中不进行任何模拟,因为这会使 测试取决于实现细节?
Freezegun不会使您的测试依赖于实现细节,因为它可以在非常低级的Python api上运行。