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