Передать несколько приспособлений в тестовый пример

#python-3.x #pytest

#python-3.x #pytest

Вопрос:

Я передаю два приспособления setup_registered_consultant и setup_registered_customer в мой тестовый пример, но последний аргумент setup_registered_customer не распознается. Мой тестовый пример HTTP_AUTHORIZATION='Token ' registered_response2.json()['token_key'] завершается ошибкой test_userdetail_logged_in_customer_accesses_consultant_user_detail_view_success - KeyError: 'token_key'

 def test_userdetail_logged_in_customer_accesses_consultant_user_detail_view_success(db, client, setup_registered_consultant, setup_registered_customer):
    registered_response = setup_registered_consultant
    registered_response2 = setup_registered_customer

    userdetail_response = client.get(path=reverse('user-detail', args=(str(registered_response.json()['id']),)),
                                      HTTP_AUTHORIZATION='Token '   registered_response2.json()['token_key'])
    assert userdetail_response.status_code == status.HTTP_200_OK
  

Как я могу передать несколько приспособлений через тестовый пример?

Отредактировано:

 @pytest.fixture
def setup_registered_customer(db, client):
    client.post(path=reverse('auto-signup-anonymous-user'),
                   data={"device_serial": "device1", "device_brand": "Apple",
                         "device_version": "1.0", "device_country": "US"})
    response = client.post(path=reverse('register'),
                            data={"device_serial": "device1", "username": "registereduser1",
                                    "email": "registereduser1@example.com", "password": "12345678"})
    return response

@pytest.fixture
def setup_registered_consultant(db, client):
    client.post(path=reverse('auto-signup-anonymous-user'),
                   data={"device_serial": "device1", "device_brand": "Apple",
                         "device_version": "1.0", "device_country": "US"})
    response = client.post(path=reverse('register'),
                            data={"device_serial": "device1", "username": "registereduser1",
                                    "email": "registereduser1@example.com", "password": "12345678"})
    get_user_model().objects.filter(username="registereduser1").update(is_consultant=True)
    ConsultantProfile.objects.create(user=get_user_model().objects.get(username="registereduser1"))
    return response
  

Комментарии:

1. Можете ли вы показать код setup_registered_customer ? Я почти уверен, что вы можете передать столько приспособлений, сколько захотите, точно так же, как в вашем коде. Я бы предположил KeyError , что это означает, что с самим приспособлением что-то не так, что ответ не содержит ожидаемого ключа.

2. Снова смотрите сообщение. Я продолжаю получать эту ошибку, если переключаю setup_registered_consultant вместо setup_registered_customer . Последний аргумент всегда терпит неудачу, независимо от того, является ли он консультантом или клиентом… Если я переключу последние два аргумента, эта часть завершится ошибкой args=(str(registered_response.json()[‘id’])

3. Я думаю, что последний аргумент всегда терпит неудачу, потому что вы назначаете его registered_response2 , и registered_response2 это то, что вы пытаетесь извлечь token_key , и, по-видимому, этого нет в ответе. Может быть, попробуйте напечатать весь ответ в верхней части теста или внутри приспособления для проверки?

4. Исправлено. Мое имя пользователя / адрес электронной почты setup_registered_consultant конфликтовало с именем пользователя и адресом электронной почты setup_registered_customer . Мне просто нужно было указать setup_registered_consultant другое имя пользователя / адрес электронной почты. Вы можете написать это в разделе ответа, и я выберу ваш ответ как лучший. Спасибо

Ответ №1:

Тестовый пример должен принимать любое количество приспособлений в списке аргументов, и порядок не имеет значения. Ваш код выглядит совершенно правильно в этом отношении.

KeyError: 'token_key' предполагает, что с переменной может быть что-то не так registered_response2 , т. Е. JSON, по-видимому, не содержит ключа «token_key», поэтому в конечном итоге это будет означать проблему с самим приспособлением, а не с тем, как оно передается в функцию тестового примера.
Как обсуждалось в комментариях к вопросу, это действительно имело место здесь: сервер возвращал неожиданный ответ из-за конфликта с размером серверной части, который был вызван тем, как сервер был вызван устройством.