Python模拟补丁语法有不同的参数编号

时间:2017-09-04 10:27:40

标签: python django unit-testing mocking

## 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'错误。

我知道我正在尝试使用1-arg方法模拟3-args方法,但如果我只是想告诉Python,那么,无论我的create_stripe_charge方法有多少参数,我只想模拟它引发异常。

执行此操作的正确语法是什么?感谢。

1 个答案:

答案 0 :(得分:2)

要在调用模拟时引发异常,请将side_effect attribute设置为异常:

@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),但使用新函数并不是一个好主意。

使用正确的模拟来替换函数也可以让你断言模拟被正确调用,并且可以对传入的参数进行断言。当你使用自己的函数时,你不能这样做。