【问题标题】:Mocking datetime yields bug in pyarrow模拟日期时间会在 pyarrow 中产生错误
【发布时间】:2021-01-11 16:07:02
【问题描述】:

为了测试,我想模拟 datetime.datetime.now() 像 here。

我正在测试的功能是通过 pyarrow 读取表格:

import pytest
import pyarrow.parquet as pq
import datetime

mockdate = datetime.datetime(2000, 1, 1, 0, 0, 0)

@pytest.fixture(autouse=True)
def patch_datetime_now(monkeypatch):
    class mydatetime:
        @classmethod
        def now(cls):
            return mockdate

    monkeypatch.setattr(datetime, 'datetime', mydatetime)
    
def function_to_test():
    date = datetime.datetime.now()
    some_table = pq.read_table("abc/def")
    return some_table, date
    
def test_function_to_test():
    
    table, date = function_to_test()
    
    assert date == mockdate

出于某种原因,模拟 now() 函数会在 pyarrow 中创建这个非常奇怪的错误:

ValueError: datetime.datetime size changed, may indicate binary incompatibility. Expected 48 from C header, got 32 from PyObject

知道如何解决这个问题吗?谢谢!

【问题讨论】:

  • 你不只是嘲笑datetime.now;你用一个但是一个名为now的类方法模拟了整个类datetime。
  • 感谢您的提示!将发布一个可行的解决方案

标签: python datetime pyarrow


【解决方案1】:

感谢 chepner 的提示。为了将来参考,这里有一个可行的解决方案:

import pytest
import pyarrow.parquet as pq
import datetime

mockdate = datetime.datetime(2000, 1, 1, 0, 0, 0)
    
def function_to_test():
    date = datetime.datetime.now()
    some_table = pq.read_table("abc/def")
    return some_table, date
    
def test_function_to_test(mocker):

    mocker.patch(__name__  + '.datetime')
    datetime.datetime.now.return_value = mockdate
    
    table, date = function_to_test()
    
    assert date == mockdate

【讨论】:

    猜你喜欢
    • 2020-01-17
    • 1970-01-01
    • 2021-01-29
    • 2015-10-11
    • 2018-06-05
    • 2013-04-01
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    相关资源
    最近更新 更多