Python Mock Stripe Methods for Testing

So I'm trying to make fun of all the stripe web hooks in a method so that I can write a Unit test for it. I use the mock library to bully stripe methods. Here is the method I'm trying to make fun of:

 class AddCardView(APIView): """ * Add card for the customer """ permission_classes = ( CustomerPermission, ) def post(self, request, format=None): name = request.DATA.get('name', None) cvc = request.DATA.get('cvc', None) number = request.DATA.get('number', None) expiry = request.DATA.get('expiry', None) expiry_month, expiry_year = expiry.split("/") customer_obj = request.user.contact.business.customer customer = stripe.Customer.retrieve(customer_obj.stripe_id) try: card = customer.sources.create( source={ "object": "card", "number": number, "exp_month": expiry_month, "exp_year": expiry_year, "cvc": cvc, "name": name } ) # making it the default card customer.default_source = card.id customer.save() except CardError as ce: logger.error("Got CardError for customer_id={0}, CardError={1}".format(customer_obj.pk, ce.json_body)) return Response({"success": False, "error": "Failed to add card"}) else: customer_obj.card_last_4 = card.get('last4') customer_obj.card_kind = card.get('type', '') customer_obj.card_fingerprint = card.get('fingerprint') customer_obj.save() return Response({"success": True}) 

This is the method for unit testing :

 @mock.patch('stripe.Customer.retrieve') @mock.patch('stripe.Customer.create') def test_add_card(self,create_mock,retrieve_mock): response = { 'default_card': None, 'cards': { "count": 0, "data": [] } } # save_mock.return_value = response create_mock.return_value = response retrieve_mock.return_value = response self.api_client.client.login(username = self.username, password = self.password) res = self.api_client.post('/biz/api/auth/card/add') print res 

Now stripe.Customer.retrieve ridiculed properly. But I can not scoff at customer.sources.create . I am really stuck with this.

+5
source share
2 answers

This is the right way to do this:

 @mock.patch('stripe.Customer.retrieve') def test_add_card_failure(self, retrieve_mock): data = { 'name': "shubham", 'cvc': 123, 'number': "4242424242424242", 'expiry': "12/23", } e = CardError("Card Error", "", "") retrieve_mock.return_value.sources.create.return_value = e self.api_client.client.login(username=self.username, password=self.password) res = self.api_client.post('/biz/api/auth/card/add', data=data) self.assertEqual(self.deserialize(res)['success'], False) 
+8
source

Although this answer is correct, there is a more convenient solution using vcrpy . This creates a cassette (record) as soon as this record does not exist. When this happens, the bullying will be transparent and the recording will be played back. Nice.

When using the vanilla pyramid application using py.test, my test now looks like this:

 import vcr # here we have some FactoryBoy fixtures from tests.fixtures import PaymentServiceProviderFactory, SSOUserFactory def test_post_transaction(sqla_session, test_app): # first we need a PSP and a User existent in the DB psp = PaymentServiceProviderFactory() # type: PaymentServiceProvider user = SSOUserFactory() sqla_session.add(psp, user) sqla_session.flush() with vcr.use_cassette('tests/casettes/tests.checkout.services.transaction_test.test_post_transaction.yaml'): # with that PSP we create a new PSPTransaction ... res = test_app.post(url='/psps/%s/transaction' % psp.id, params={ 'token': '4711', 'amount': '12.44', 'currency': 'EUR', }) assert 201 == res.status_code assert 'id' in res.json_body 
0
source

All Articles