如何使用“现在”测试Django REST框架过滤器?

时间:2019-02-27 20:57:16

标签: django django-rest-framework

其他人解释了为什么编写依赖于当前时间的测试不是一个好主意(例如,不可重现的错误,并且无法测试特殊日期,例如夏令时)。因此,在测试序列化程序时,我使用了以下模式:

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属性。我将如何对过滤器进行类似的测试,理想情况下无需模拟任何内容,因为这会使测试取决于实现细节?

1 个答案:

答案 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上运行。