Python не может имитировать вызов функции из тестового класса

Я пытаюсь издеваться над вызовом bigtable в своем модульном тесте, объявляя такие приборы:

@pytest.fixture()
def bigtableMock():
    bigtableMock = Mock(spec=google.cloud.bigtable.table.Table)
    yield bigtableMock

@pytest.fixture()
def bigtableInstanceMock(bigtableMock):
    bigtableInstanceMock = Mock(spec=google.cloud.bigtable.instance.Instance)
    bigtableInstanceMockAttrs = {'table': bigtableMock}
    bigtableInstanceMock.configure_mock(**bigtableInstanceMockAttrs)
    yield bigtableInstanceMock

@pytest.fixture()
def myDao(bigtableInstanceMock):
    yield MyDao(bigtableInstanceMock)

Я издеваюсь над функцией read_rows так:

def mockReadRowsFuncWith1Dto(testDto):
    mockTableRowData = {}
    mockTableRowData['columnFamily'] = asDict(testDto)
    rowDataMock = MagicMock()
    rowDataMock.__iter__.return_value = [mockTableRowData]
    rowDataMock.__len__ = 1
    def mockReadRowsFunc(startKey, endKey, limit, end_inclusive):
        return rowDataMock

    return mockReadRowsFunc

Когда я вызываю свою тестовую функцию:

def test_read_table(
   myDao,
   testDto,
   bigtableMock
):
    bigtableMock.read_rows = mockReadRowsFuncWith1Dto(testDto)
    samp = bigtableMock.read_rows(
        startKey = "asdf",
        endKey = "sadf",
        limit=1,
        end_inclusive=True
        )
    print(f"\test data {samp}")
    myDao.readTable(...)

Внутри myDao.readTable я вызываю read_rows так:

tableRows: PartialRowData = self.table.read_rows(
            start_key=startKey,
            end_key=endKey,
            limit=10,
            end_inclusive=True
        )

Однако я не получаю возврата magicMock, который я ожидаю внутри readTable, tableRows:<Mock name='mock.table().read_rows()' id='4378752480'>, тогда как в тестовой функции я могу распечатать макет Magic: test data <MagicMock id='4413191168'>. Независимо от оператора печати или нет, я никогда не смогу вызвать правильную издевательскую функцию read_rows. Что я делаю не так?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в моем случае заключалась в том, что приспособление для bigtableMock отличалось между test_read_table и приспособлением для myDao. Я изменил свои тестовые примеры, чтобы включить насмешку над таблицей внутри bigtableMock, например:

@pytest.fixture(read_row_data, mock_append_row)
def bigtableMock():
    bigtableMock = Mock(spec=google.cloud.bigtable.table.Table)
    bigtableMock.read_rows.return_value = [read_row_data]
    bigtableMock.append_row.return_value = mock_append_row
    yield bigtableMock

Другие вопросы по теме