python: издеваться над одним классом с другой реализацией - PullRequest
0 голосов
/ 17 апреля 2020

Super basi c ложный вопрос, который меня расстраивает, спасибо, что заглянули.

У меня есть класс, скажем, IngestionClient, который реализует некоторые http-запросы к конечным точкам в другом сервисе. Мне нужно издеваться над этим для испытаний.

В прошлом, когда мне не требовалось, чтобы конечные точки действительно что-то делали для тестов, я просто делал

@mock.patch('clients.IngestionClient.endpoint_1', return_value=Mocked200Response())
def test_update(endpoint_1):
    ...

Но теперь у меня есть еще несколько таких методов в клиенте таким образом, каждый тест имеет как четыре фиктивных декоратора, и мне как-то нужен один из методов, чтобы действительно что-то делать.

Я хотел бы реализовать класс MockedIngestionClient как что-то вроде

class MockedIngestionClient:
    def __init__(self, config):
        self.config = config

    def endpoint_1(self, *args, **kwargs):
        return Mocked200Response()

    def endpoint_2(self, row_id, new_value):
        with self.config.mysql_connector.get_mysql_session() as sess:
            row = sess.query(Table).filter_by(id=row_id)
            row.value = new_value

Чтобы в тестах я мог сделать что-то вроде

@mock.patch('clients.IngestionClient', testing_utils.MockedIngestionClient)
def test_update(IngestionClient):
    ...

Возможно ли это? Я знаю, что мог бы заменить IngestionClient на объект MagicMock, а затем добавить все нужные мне функции в качестве одноразовых, но если бы это было возможно сделать так, как я описал выше, было бы чище.

1 Ответ

0 голосов
/ 18 апреля 2020

Решено с параметром new для patch.object:


def mocked_endpoint_2(self, *args):
    ...

@mock.patch.object(
    clients.IngestionClient,
    'endpoint_2',
    new=mocked_endpoint_2
)
...