python runtime_error ai_generated true

AssertionError: assert datetime.datetime(2024, 1, 1, 0, 0) == datetime.datetime(2025, 6, 1, 12, 0) # freezegun 已激活,但导入的 datetime 是真实的那一个

AssertionError: assert datetime.datetime(2024, 1, 1, 0, 0) == datetime.datetime(2025, 6, 1, 12, 0) # freezegun is active but the imported datetime is the real one

ID: python/pytest-freezegun-datetime-import

其他格式: JSON · Markdown 中文 · English
80%修复率
87%置信度
0证据数
2025-02-08首次发现

版本兼容性

版本状态引入弃用备注
1.5.x active — — —

根因分析

被测代码在 freezegun patch 模块之前以 'from datetime import datetime' 方式导入了 datetime,导致测试持有未打补丁的类引用。

English

The code under test imported datetime as 'from datetime import datetime' before freezegun patched the module, so the test holds a reference to the unpatched class.

generic

解决方案

  1. 94% 成功率
    # BAD:  from datetime import datetime
    # GOOD: import datetime
    then use datetime.datetime.now()
    
    # Test:
    from freezegun import freeze_time
    
    @freeze_time('2025-06-01 12:00:00')
    def test_x():
        assert get_now() == datetime.datetime(2025, 6, 1, 12, 0)
  2. 80% 成功率
    import importlib
    
    @freeze_time('2025-06-01')
    def test_x():
        import myapp.clock
        importlib.reload(myapp.clock)
        assert myapp.clock.now().year == 2025

无效尝试

常见但无效的做法:

  1. 85% 失败

    tick only affects the patched clock; the unpatched datetime reference is unaffected and still returns real time.

  2. 92% 失败

    Timezone is not the issue; the datetime class itself is not the one freezegun patched.