Python: pytest가 Flask 세션에 액세스하고 컨텍스트 변수를 요청합니다.
나는 이전에 Python: pytest and Flask template context processor functions.에서 pytest의 애플리케이션 픽스처 및 테스트 클라이언트 픽스처에 대해 블로그에 올렸습니다(pytest entry module conftest.py 섹션을 참조하십시오. )
언급된 게시물의 테스트 클라이언트 픽스처:
@pytest.fixture(scope='module')
def test_client( app ):
"""
Creates a test client.
app.test_client() is able to submit HTTP requests.
The app argument is the app() fixture above.
"""
with app.test_client() as testing_client:
yield testing_client # Return to caller.
Flask’s context variable session에 액세스하는 코드를 테스트할 때 위의 고정 장치가 작동하지 않습니다. 이 변수에 액세스하기 위해 공식 문서에는 다음과 같이 명시되어 있습니다.
If you want to access or set a value in the session before making a request, use the client’s session_transaction() method in a with statement. It returns a session object, and will save the session once the block ends.
나는 그것을 시도했지만 작동하지 않습니다 ... 그것은 "인기있는"문제입니다. 그것은 몇 년 동안 주변에 있었다. 그것에 대한 몇 가지 게시물이 있지만 대부분의 제안은 나를 위해 작동하지 않습니다.
Sessions are empty when testing #69이 이 문제를 제기하고 사용자russmac가 해결책을 제안합니다.
@pytest.fixture(scope='module')
def test_client( app ):
"""
Creates a test client.
app.test_client() is able to submit HTTP requests.
The app argument is the app() fixture above.
"""
with app.test_client() as testing_client:
"""
See: https://github.com/pytest-dev/pytest-flask/issues/69
Sessions are empty when testing #69
"""
with testing_client.session_transaction() as session:
session['Authorization'] = 'redacted'
yield testing_client # Return to caller.
이것은 나를 위해 작동합니다. 그러나 액세스하려면variable session 테스트 코드가 다음 범위 내에 있어야 합니다.
with app.test_request_context():
그렇지 않으면 RuntimeError: Working outside of request context 오류가 발생합니다. 또한 위의 호출이 없으면 적절한 코드가 테스트 중에 요청 변수에 액세스할 수 없습니다.
다음은 작업 중인 프로젝트의 적절한 테스트 방법입니다.
@pytest.mark.timesheet_bro
def test_close( app ):
bro_obj = TimesheetBRO( 1 )
#
# RuntimeError: Working outside of request context.
#
# session[ 'user_id' ] = 100
#
with app.test_request_context( '?searchType={}'.format(UNRESTRICT_SEARCH_TYPE) ):
assert request.args[ 'searchType' ] == UNRESTRICT_SEARCH_TYPE
assert request.values.get( 'searchType' ) == UNRESTRICT_SEARCH_TYPE
session[ 'user_id' ] = 1
data = bro_obj.close( 326 )
assert bro_obj.last_message == ''
assert data['status']['code'] == HTTPStatus.OK.value
적절한 코드 내에서 session[ 'user_id' ]는 사용자가 성공적으로 로그인한 후에 설정됩니다. 테스트 중인 코드에 대한 올바른 사전 조건을 생성하려면 테스트 코드에서 이 값을 설정합니다. 또한 request.values.get( 'searchType' )은 테스트 중인 코드에서도 사용됩니다.
다음은 요청 매개변수를 제출하지 않는 또 다른 적절한 테스트 방법입니다.
@pytest.mark.timesheet_bro
def test_update_last_timesheet_id( app ):
bro_obj = TimesheetBRO( 1 )
with app.test_request_context():
session[ 'user_id' ] = 1
data = bro_obj.update_last_timesheet_id( 1, 1123 )
assert bro_obj.last_message == ''
assert data['status']['code'] == HTTPStatus.OK.value
어느 시점에서 이 정보가 도움이 되기를 바랍니다... 읽어주셔서 감사합니다.
Reference
이 문제에 관하여(Python: pytest가 Flask 세션에 액세스하고 컨텍스트 변수를 요청합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/behainguyen/python-pytest-accessing-flask-session-and-request-context-variables-1l64텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)