Как протестировать веб-узлы с помощью Mock Data

Я пытаюсь написать unit test, который помещает событие mock в мой веб-сайт.

Я пошел и вытащил событие из своих журналов и попытался отправить его с включенным тестовым режимом, но я (несколько предсказуемо) получил ошибку:

аналогичный объект существует в режиме реального времени, но для выполнения этого запроса использовался ключ тестового режима.

Достаточно честный. Итак, как мне создать фиктивное событие, которое я действительно могу отправить на свой веб-хоккей, и обработать его правильно?

Здесь мой текущий тест:

class StripeTest(TestCase):
    def setUp(self):
        self.client = Client()

    def test_receiving_a_callback(self):
        with open('donate/test_assets/stripe_event.json', 'r') as f:
            stripe_event = simplejson.load(f)

        self.client.post('/donate/callbacks/stripe/',
                         data=simplejson.dumps(stripe_event),
                         content_type='application/json')

Ответ 1

Решение состоит в том, чтобы создавать свои собственные данные. В приведенном ниже коде мы создаем тестовый платеж, создавая маркер полосы, затем отправляем его через передний конец (на/donate/endpoint).

После того, как передняя часть работает правильно, вы можете получить событие из полосы, а затем отправить его на конечную точку веб-хоста разработчика.

Это больше, чем я ожидал, и мне не нравится, что мои тесты попадают в сеть, но, похоже, это достойное решение. Я чувствую себя намного увереннее в своих платежах, чем раньше.

    def test_making_a_donation_and_getting_the_callback(self):
        """These two tests must live together because they need to be done sequentially.

        First, we place a donation using the client. Then we send a mock callback to our
        webhook, to make sure it accepts it properly.
        """
        stripe.api_key = settings.STRIPE_SECRET_KEY
        # Create a stripe token (this would normally be done via javascript in the front
        # end when the submit button was pressed)
        token = stripe.Token.create(
            card={
                'number': '4242424242424242',
                'exp_month': '6',
                'exp_year': str(datetime.today().year + 1),
                'cvc': '123',
            }
        )

        # Place a donation as an anonymous (not logged in) person using the
        # token we just got
        r = self.client.post('/donate/', data={
            'amount': '25',
            'payment_provider': 'cc',
            'first_name': 'Barack',
            'last_name': 'Obama',
            'address1': '1600 Pennsylvania Ave.',
            'address2': 'The Whitehouse',
            'city': 'DC',
            'state': 'DC',
            'zip_code': '20500',
            'email': '[email protected]',
            'referrer': 'footer',
            'stripeToken': token.id,
        })

        self.assertEqual(r.status_code, 302)  # 302 because we redirect after a post.

        # Get the stripe event so we can post it to the webhook
        # We don't know the event ID, so we have to get the latest ones, then filter...
        events = stripe.Event.all()
        event = None
        for obj in events.data:
            if obj.data.object.card.fingerprint == token.card.fingerprint:
                event = obj
                break
        self.assertIsNotNone(event, msg="Unable to find correct event for token: %s" % token.card.fingerprint)

        # Finally, we can test the webhook!
        r = self.client.post('/donate/callbacks/stripe/',
                             data=simplejson.dumps(event),
                             content_type='application/json')

        # Does it return properly?
        self.assertEqual(r.status_code, 200)