Python:如何模拟 datetime.utcnow()?

新手上路,请多包涵

我有以下内容:

 from datetime import datetime

def get_report_month_key():
    month_for_report = datetime.utcnow()
    return month_for_report.strftime("%Y%m")

我如何模拟 datetime.utcnow() 以便我可以对此函数编写单元测试?

尝试阅读这篇文章 但我无法在 utcnow() 上为我工作

原文由 Steven Yong 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 555
2 个回答

在你的测试文件中:

 from yourfile import get_report_month_key
import mock
import unittest
from datetime import datetime

class TestCase(unittest.TestCase):

    @mock.patch('yourfile.datetime')
    def test_dt(self, mock_dt):
        mock_dt.utcnow = mock.Mock(return_value=datetime(1901, 12, 21))
        r = get_report_month_key()
        self.assertEqual('190112', r)

原文由 dasjotre 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您不在正在测试的模块中创建任何 datetime 实例,则 dasjotre 接受的答案有效。如果您尝试创建一个 datetime 它将创建一个 Mock 对象,而不是在标准 datetime 对象上创建一个具有预期方法的对象。这是因为它用模拟替换了整个类定义。您可以使用类似的方法通过使用 datetime 作为基础来创建模拟定义,而不是这样做。

我的模块.py

 from datetime import datetime

def after_y2k():
    y2k = datetime(2000, 1, 1)
    return y2k < datetime.utcnow()

test_mymodule.py

 import unittest
import datetime
from mock import patch, Mock
import mymodule
from mymodule import after_y2k

class ModuleTests(unittest.TestCase):
    @patch.object(mymodule, 'datetime', Mock(wraps=datetime.datetime))
    def test_after_y2k_passes(self):
        # Mock the return and run your test (Note you are doing it on your module)
        mymodule.datetime.utcnow.return_value = datetime.datetime(2002, 01, 01)
        self.assertEqual(True, after_y2k())

        mymodule.datetime.utcnow.return_value = datetime.datetime(1999, 01, 01)
        self.assertEqual(False, after_y2k())

    @patch('mymodule.datetime')
    def test_after_y2k_fails(self, mock_dt):
        # Run your tests
        mock_dt.utcnow = Mock(return_value=datetime.datetime(2002, 01, 01))
        self.assertEqual(True, after_y2k())

        # FAILS!!! because the object returned by utcnow is a MagicMock w/o
        # datetime methods like "__lt__"
        mock_dt.utcnow = Mock(return_value=datetime.datetime(1999, 01, 01))
        self.assertEqual(False, after_y2k())

原文由 Ryan Widmaier 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题