如何从测试功能中修补灯具中使用的对象

时间:2019-02-03 23:12:38

标签: python testing mocking pytest

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

0 个答案:

没有答案