1

I need to mock 2 external API responses in 1 unit test. I simulate the responses from a paginated API call. I am trying to make it with unittest mock patch.multiple decorator. But patch always failed. How should I use patch.multiple?

my unit test (movie_test.py):

from unittest.mock import patch, DEFAULT, Mock

import pytest
import json

from src.app import create_app

app = create_app()  # pylint: disable=invalid-name


@pytest.fixture
def client():
    app.config['TESTING'] = True

    yield app.test_client()


@pytest.fixture
def movie_search_sort_verification_page_1():
    with open("tests/fixtures/movie_search_sort_verification_page_1.json") as f:
        return json.load(f)


@pytest.fixture
def movie_search_sort_verification_page_2():
    with open("tests/fixtures/movie_search_sort_verification_page_2.json") as f:
        return json.load(f)


@patch.multiple("app.routes.requests.get", create=True, movie_search_sort_verification_page_1=DEFAULT, movie_search_sort_verification_page_2=DEFAULT)
def test_movie_search_sort_verification_using_mock(movie_search_sort_verification_page_1, movie_search_sort_verification_page_2, client):

    movie_search_sort_verification_page_1.return_value = Mock(ok=True)
    movie_search_sort_verification_page_1.return_value.json.return_value = movie_search_sort_verification_page_1()

    movie_search_sort_verification_page_2.return_value = Mock(ok=True)
    movie_search_sort_verification_page_2.return_value.json.return_value = movie_search_sort_verification_page_2()

    resp = client.get('/v1/movies/search?\
    query=terminator\
    &region=en_US\
    &genres=878\
    &sort=title,asc,1\
    &sort=release_date,desc,2\
    &sort=vote_average,desc,3')

    assert len(resp.json['results']) == 4
    assert resp.status_code == 200

Thank you

Zhongjie Fan
  • 65
  • 2
  • 9
  • Do you have to use @patch.multiple? If you're fine with it, you can stack multiple @patch('import.path.example') decorators on top of the same function. Note they will have to be put into the function in reverse order: @patch('p2') @patch('p1') def foo(mock_p1, mock_p2) – Jared Dobry May 16 '21 at 23:29
  • @JaredDobry Thank you. I tried. It didn't work probably because import.path are same for 1st and 2nd patches. – Zhongjie Fan May 17 '21 at 01:17

0 Answers0