【问题标题】:freeze_time doesn't work inside invoked functionsfreeze_time 在调用的函数中不起作用
【发布时间】:2021-03-24 17:23:12
【问题描述】:
# test.py
from freezegun import freeze_time
from actual import DummyClass

class DummyClassMock(DummyClass):
   def some_function(self):
     # does something


class TestClass():
   def setUp(self):
      self.dummy = DummyClassMock()

   @freeze_time('2021-01-01')
   def test_dummy_function(self):
      self.assertTrue((self.dummy.dummy_function - datetime.utcnow()).total_seconds() >= 1)

# actual.py
from datetime import datetime, timedelta

class DummyClass():
   def dummy_function(self):
       return datetime.utcnow() + timedelta(5)

我的代码遵循上述结构。有了这个,如果我单独执行test_dummy_function,dummy_function 将返回 2021-01-01 并且测试用例通过。但是,当我将它与项目中的所有其他测试用例一起运行时,它失败了。内容也不依赖。

【问题讨论】:

  • 如果它适用于一种情况,但不适用于其他测试用例,很可能其他测试用例会出现问题。你能把它们贴出来让我们看看吗?
  • @Canbach 它是一个庞大的测试用例套件,我相信其他测试用例不会影响,因为这些测试是针对一段新代码的,并且与任何现有代码完全无关或测试用例。而且,我正在测试的功能没有输入。它只需要启动 datetime.utcnow() 并添加 timedelta 并返回日期。

标签: python django python-mock freezegun


【解决方案1】:

不是一个特别好的解决方案,但我使用的解决方法是定义一个只返回 datetime.utcnow() 并模拟它的函数。我的测试用例会将 freeze_time 中使用的日期指定为返回值。它看起来像,

@mock.patch(actual.DummyClass.now_function)
 @freeze_time('2021-01-01')
   def test_dummy_function(self, mock_dt):
      now = datetime.utcnow()
      mock_dt.return_value = now
      self.assertTrue((self.dummy.dummy_function - now).total_seconds() >= 1)


# actual.py
Class DummyClass():
    def now_function():
        return datetime.utcnow()

    def dummy_function():
        return now_function()+timedelta(days=5)

【讨论】:

    猜你喜欢
    • 2015-08-19
    • 2019-03-01
    • 1970-01-01
    • 2021-12-28
    • 2023-03-27
    • 2018-02-24
    • 2016-03-12
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多