Я пишу набор тестов для моего API, и возвращаемый результат некоторых конечных точек зависит от внутреннего состояния приложения.Моя цель состоит в том, чтобы макетировать эти конкретные «функции проверки» для проверки всех случаев.
# conftest.py
@pytest.fixture(scope='module')
def flask_app():
app = Flask(__name__)
app.config.from_pyfile('flaskconfig.py')
api = ApiUnderTest()
bp = api.get_blueprint()
app.register_blueprint(bp)
return app
@pytest.fixture(scope='module')
def test_client(flask_app):
client = flask_app.test_client()
ctx = flask_app.app_context()
ctx.push()
yield client
ctx.pop()
# test_case.py
@pytest.mark.parametrize('check_return', [True, False])
def test_api_call(test_client, check_return):
# Here I want to patch the function ApiUnderTest.state.check()
# to return the 'check_return' value. This function will be
# evaluated when calling the endpoint
response = test_client.get('/endpoint')
if check_return is True:
assert response.status_code == 200
else:
assert response.status_code == 409
Это некоторый упрощенный код, но я думаю, что он показывает то, чего я хочу достичь.Теперь вопрос: как это можно сделать?
Я пытался исправить определенную функцию внутри test_api_call
с помощью модуля mock
, но это не повлияло на экземпляр объекта, используемый в conftest.py
.
Обновление:
Поскольку исправление с использованием mock
должно произойти до того, как объект будет найден.Я сейчас использую это решение:
@pytest.mark.parametrize('check_return', [True, False])
def test_api_call(api_module, test_client, check_return):
api_module.state.check = classmethod(lambda self: check_return)
response = test_client.get('/endpoint')
if check_return is True:
assert response.status_code == 200
else:
assert response.status_code == 409