Поведение: доступ к переменным context.config вне определений шагов

Я не могу найти способ, как инициализировать мой ApiClient со значением context.config.userdata['url'] из поведения.ini

behave.ini

[behave.userdata]
url=http://some.url

steps.py

from behave import *
from client.api_client import ApiClient

# This is where i want to pass the config.userdata['url'] value
api_calls = ApiClient('???') 


@given('I am logged as "{user}" "{password}"')
def login(context, user, password):
    context.auth_header = api_calls.auth(user, password)

api_client.py

class ApiClient(object):

    def __init__(self, url):
        self.url = url

    def auth(self, email, password):
        auth_payload = {'email': email, 'password': password}
        auth_response = requests.post(self.url + '/api/auth/session', auth_payload)

        return auth_response.text

person Sarunas Urbelis    schedule 13.06.2018    source источник
comment
Проблема с чтением ini файла? stackoverflow.com/questions/8884188/ помочь?   -  person doctorlove    schedule 13.06.2018
comment
Нет, я могу прочитать ini-файл и получить доступ к данным из него в своих определениях шага. Хотя я понятия не имею, как получить к нему доступ за пределами шагов, чтобы я мог использовать его значения при инициализации ApiClient.   -  person Sarunas Urbelis    schedule 13.06.2018


Ответы (2)


Во-первых, в вашем behave.ini форматирование имеет значение. То есть обратите внимание на пробелы:

[behave.userdata]
url = http://some.url

Во-вторых, вместо создания объекта ApiClient в /features/steps/steps.py вы должны создать его в /features/environment.py. Что это environment.py? Если вы не знаете, это в основном файл, который определяет, что должно произойти до/во время/после запуска вашего теста. Подробнее см. здесь.

По сути, у вас будет что-то вроде:

environment.py

from client.api_client import ApiClient

""" 
The code within the following block is checked before all/any of test steps are run.
This would be a great place to instantiate any of your class objects and store them as
attributes in behave's context object for later use.
"""
def before_all(context):         
    # The following creates an api_calls attribute for behave's context object
    context.api_calls = ApiClient(context.config.userdata['url'])

Позже, когда вы захотите использовать свой объект ApiClient, вы можете сделать это так:

steps.py

from behave import *

@given('I am logged as "{user}" "{password}"')
def login(context, user, password):
    context.api_calls.auth(user, password)
person natn2323    schedule 13.06.2018

Я знаю, что это очень старый вопрос, но ответ не актуален. В текущей документации пробелы не требуются, и проблема OP - это тег заголовка. Должно быть [behave]

https://behave.readthedocs.io/en/latest/behave.html

person Andrew Sangster    schedule 28.05.2020