#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
, которые приведут к сбою теста. Я не уверен, что вы на самом деле тестируете здесь, поскольку вы, кажется, издеваетесь над всем, я бы предположил, что это только для иллюстрации.