Python: pytest가 Flask 세션에 액세스하고 컨텍스트 변수를 요청합니다.

Flask의 컨텍스트 변수, 세션 및 요청에 액세스하기 위해 pytest 메서드를 활성화하는 방법.

나는 이전에 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.

https://flask.palletsprojects.com/en/2.2.x/testing/



나는 그것을 시도했지만 작동하지 않습니다 ... 그것은 "인기있는"문제입니다. 그것은 몇 년 동안 주변에 있었다. 그것에 대한 몇 가지 게시물이 있지만 대부분의 제안은 나를 위해 작동하지 않습니다.

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


어느 시점에서 이 정보가 도움이 되기를 바랍니다... 읽어주셔서 감사합니다.

좋은 웹페이지 즐겨찾기