Проблема с синтаксисом патча Python с другим количеством аргументов

-2
## tests file
@mock.patch('profiles.models.create_stripe_charge', StripeMocks._mock_raises_stripe_error)
def my_test(self):
    #  ... stuff


## logic file
def create_stripe_charge(customer, amount_in_cents, capture=True):
    # ... stuff

## mocks file
class StripeMocks:
    def _mock_raises_stripe_error(self):
        raise stripe.error.StripeError

При выполнении моего теста я получил _mock_raises_stripe_error() takes 1 positional argument but 3 were given' ошибка".

Я понимаю, что я пытаюсь высмеять метод 3-args с помощью метода 1-arg, но что, если я просто хочу сказать Python: пожалуйста, независимо от того, сколько аргументов имеет метод create_stripe_charge, я просто хочу имитировать, что это вызывает исключение.

Каков правильный синтаксис для этого? Благодарю.

Теги:
unit-testing
mocking

1 ответ

2
Лучший ответ

Чтобы вызвать исключение при вызове mock, установите для атрибута side_effect исключение:

@mock.patch('profiles.models.create_stripe_charge',
            side_effect=stripe.error.StripeError)
def my_test(self, mock_create_stripe_charge):
    # ...

Вы полностью заменили create_stripe_charge(), с функцией, которая принимает только один аргумент (self). Вы можете использовать *args для захвата дополнительных аргументов (и поскольку вы использовали несвязанный метод, нет необходимости вообще использовать self), но использование новой функции на самом деле не очень хорошая идея.

Использование правильного макета для замены функции также позволяет утверждать, что макет был вызван правильно, и вы можете сделать утверждения о том, какие аргументы были переданы. Вы не можете этого сделать, если вместо этого используете свою собственную функцию.

  • 0
    Отличное объяснение ... застрял в документации .. Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню