pytestフィクスチャの内部関数から値にアクセスする

2020-08-02 python python-3.x unit-testing pytest python-unittest

私のpytestフィクスチャ内の内部関数からの応答にアクセスしようとしています。これがpythonの問題なのか、pytestのビルド方法に固有の問題なのかはわかりません。以下のスニペットはばかげた例ですが、問題を示しています。 TypeError: 'function' object is not subscriptableの問題TypeError: 'function' object is not subscriptable 。これを解決する方法がわからないので、助けをお願いします。

import pytest
import requests


@pytest.fixture
def my_fixture():
    def make_request(url):
        response = requests.get(url)
        return {'code': response.status_code, 'content': response.content}

    response = make_request
    save_for_after_yield = response['content']
    yield response

    # print simulates doing something with the content as part of the clean-up
    print(save_for_after_yield)


def test_making_requests(my_fixture):
    response = my_fixture('http://httpbin.org')
    assert 200 == response

Answers

問題は、 yieldまで内部関数が呼び出されないため、その前に結果を保存できないことです(URLパラメーターがわからないため、結果を知ることができません)。あなたができることは、内部関数内に設定された後に変数を保存することです:

@pytest.fixture
def my_fixture():
    def make_request(url):
        nonlocal response_content  # needed to access the variable in the outer function
        response = requests.get(url)
        response_content = response.content
        return {'code': response.status_code, 'content': response.content}

    response_content = None  # will be set when the fixture is used
    yield make_request
    print(response_content)


def test_making_requests(my_fixture):
    response = my_fixture('http://httpbin.org')
    assert 200 == response['code']

Related