Pytest, как я высмеиваю побочные эффекты для вызова функции, который зависит от ее родительского параметра вызова - PullRequest
4 голосов
/ 17 января 2020

Это мой текущий тест:

Моя настройка:

class CheckTestParentMocked:
    @pytest.fixture(autouse=True)
    def run_around_tests(self, mocker):
        self.profile = 'myprofile'
        self.region = 'eu-west-1'
        mocked_boto = mocker.patch(self.boto_client_path) #mypackage.module.boto3
        mocked_session = mocked_boto.Session()
        self.mocked_client = mocked_session.client()

Моя актуальная оценка:

def test_gets_non_authorizer_api(self):
    def side_effect(*args, **kwargs):
        if args or kwargs:
            # these are resources
            return [{
                'items': [
                    {
                        'id': 'resource-id-foo',
                        'path': '/',
                        'resourceMethods': ['GET']
                    }
                ]
            }]
        else:
            # these are apis
            return [{'items': [
                {
                    'id': 'foo',
                    'name': 'foo-name'
                }
            ]
            }]

    self.paginator.paginate.side_effect = side_effect

    self.mocked_client.get_method.return_value = {
        'authorizationType': 'NONE'
    }
    assertion = {
        'API Name': 'foo-name', 'API Methods': 'GET', 'Resource Path': '/', 'Region': self.region,
        'Authorization Type': 'NONE'
    }
    self.mocked_client.get_paginator('get_rest_apis').paginate()
    self.mocked_client.get_paginator('get_resources').paginate(restApiId='someid')

paginate() Результат зависит от параметра перешел на get_paginator. Сейчас мне повезло, что я могу использовать параметры paginate, чтобы определить, каким должно быть поведение, но как я могу определить макет, чтобы paginate () возвращал мне определенные c значения, основанные на параметрах get_paginator?

1 Ответ

3 голосов
/ 24 января 2020

Вы всегда можете заменить любую часть в цепочке насмешливых вызовов вашими собственными методами, чтобы поставить требуемый лог c.

Например:

def get_paginate_mock(paginator_param):
    return {
        'get_rest_apis': mock.Mock(
            paginate=mock.Mock(return_value='called with get_rest_apis')),
        'get_resources': mock.Mock(
            paginate=mock.Mock(return_value='called with get_resources'))
        }.get(paginator_param, mock.Mock())

self.mocked_client.get_paginator = get_paginate_mock

self.mocked_client.get_paginator('get_rest_apis').paginate()
'called with get_rest_apis'

self.mocked_client.get_paginator('get_resources').paginate()
'called with get_resources'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...