Имитация полета пайрроу

#python #mocking #pytest #pyarrow #magicmock

Вопрос:

Я пытаюсь имитировать полет from pyarrow import flight pyarrow, но у меня возникают проблемы с этим. Пожалуйста, возьмите мой простой пример кода ниже для справки о проблеме:

в test.py

 from pyarrow import flight
from unittest.mock import MagicMock


def pyarrow_func(obj):
    flight_desc = flight.FlightDescriptor.for_command(obj.sqlquery)
    options = flight.FlightCallOptions(headers=[obj.bearer_token])
    schema = obj.client.get_schema(flight_desc, options)
    flight_info = obj.client.get_flight_info(flight.FlightDescriptor.for_command(obj.sqlquery), options)
    reader = obj.client.do_get(flight_info.endpoints[0].ticket, options)

    # do something
    return "something"


def test_something(mocker):
    mocked_flight = MagicMock()
    mocked_flight.FlightDescriptor.for_command = lambda x: None
    mocked_flight.FlightCallOptions = lambda x: None
    mocker.patch('pyarrow.flight', return_value=mocked_flight)

    o = MagicMock()
    o.sqlquery = "some sql query"
    o.bearer_token = "some_token"
    o.client.get_schema = lambda x: None
    o.client.get_flight_info= lambda x: None
    o.client.do_get = lambda x: None
    pyarrow_func(o)

    print("testing only")
    assert False
 

При запуске pytest test.py -v я получаю сообщение об ошибке типа:

 test.py:7: in pyarrow_func
    options = flight.FlightCallOptions(headers=[obj.bearer_token])
pyarrow/_flight.pyx:132: in pyarrow._flight.FlightCallOptions.__init__
    ???
stringsource:48: in vector.from_py.__pyx_convert_vector_from_py_std_3a__3a_pair_3c_std_3a__3a_string_2c_std_3a__3a_string_3e___
    ???
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

>   ???
E   ValueError: too many values to unpack (expected 2)
 

Похоже, что ему не удалось смоделировать объект полета и все еще использовать код pyarrow/_flight.pyx:132 . Как я могу правильно издеваться flight и все функции под ним?

Я попытался исправить оба pyarrow.flight и pyarrow._flight безуспешно.

К вашему сведению, для этого требуется pytest и pytest-mock установлен

Обновить:

После некоторых исследований кажется, что проблема в следующем : module built in C, and unittest.mock only supports modifying pure Python objects and functions . Не уверен, есть ли какая-либо альтернатива. Одна из возможных возможностей — обернуть их в функции python

Комментарии:

1. Проблема в том, что вы не исправляете правильный экземпляр, проверьте, где нужно исправить . Кроме того, есть пара лямбд, настроенных с неправильным количеством параметров, и ваши поддельные get_flight_info возвраты None , которые приведут к сбою теста. Я не уверен, что вы на самом деле тестируете здесь, поскольку вы, кажется, издеваетесь над всем, я бы предположил, что это только для иллюстрации.