我正在为我的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