0

我正在编写一个严重依赖日期和时间的应用程序。我希望能够对now()and有一个可注射的概念today()。我在想我可以编写我自己版本的这两个函数来检查一些中心设置,我将其称为INJECTED_NOW. 如果INJECTED_NOW为 None,上述函数将只返回 和 的datetime.datetime.now()datetime.date.today()。但是,如果INJECTED_NOW有一个日期时间值,上述函数将使用它来获取 now() 和 today()。

我想知道如何存储 INJECTED_NOW 使其可变。我希望能够在测试用例的开头设置它并在另一个测试用例之前对其进行修改。同样,我希望能够从请求中设置它,也许使用中间件。

这种方法是否有意义,如果是,我应该如何存储 INJECTED_NOW?我想避免数据库访问。有没有解决这个问题的替代方法?

4

2 回答 2

4

最近发布了一个名为 FreezeGun 的库,可以像您描述的那样指定日期时间:

http://stevepulec.com/freezegun/

于 2012-12-26T21:10:41.823 回答
3

这是一种使用模拟的方法,有关模拟的更多信息,请参阅文档

# this should be the code your are testing
import datetime

def one_minute_ago():
    return (datetime.datetime.now() - datetime.timedelta(seconds=60)).time()


# this would be in your tests file
import mock
import sys
import unittest

class SomeTestcase(unittest.TestCase):

    def test_one_minute_ago(self):
        real_datetime = datetime.datetime
        fake_now = datetime.datetime(2012, 12, 21, 11, 13, 13)
        with mock.patch('datetime.datetime', spec=datetime.datetime) as datetime_mock:
            datetime_mock.now.return_value = fake_now

            self.assertEqual(one_minute_ago(), datetime.time(11, 12, 13))


if __name__ == '__main__':
    sys.exit(unittest.main())

要对其进行测试,只需将代码复制到一个文件并使用 Python 运行它。

于 2012-12-28T15:27:49.317 回答