AttributeError: у объекта 'dict' нет атрибута 'url' - PullRequest
0 голосов
/ 07 февраля 2020

Я пишу некоторые тесты API в pytest, которые принимают объект user, сгенерированный из служебного класса. Затем он вызывает библиотеку requests для выполнения необходимых вызовов API.

Ниже приведен мой код, который проверяет операции /user.

import requests

class users:
    def __init__(self, user_with_token):
        self.token = user_with_token["Token"]
        self.url = 'http://127.0.0.1:5000/api/Users/'
        self.headers = {'token': self.token}

    def get_all_users(self):
        return requests.get(self.url, headers=self.headers).status_code

    def delete_user(self):
        return requests.delete(self.url, headers=self.headers).text

    def update_user(self):
        return requests.post(self.url, headers=self.headers).text

Вот тесты, которые вызывают выше :

import pytest
from endpoints.users import users

def get_all_users(user_with_token):
    result = users.get_all_users(user_with_token)
    assert result == 200

def test_delete_all_users(user_with_token):
    result = users.delete_user(user_with_token)
    assert "Current user deleted" in result

Вот определение, которое генерирует поддельные данные для использования тестом:

def generate_user_with_token():
    fake = Faker()
    url = 'http://127.0.0.1:5000/api/Register/'

    username = fake.name().split(' ', 1)[0],
    email = fake.email(),
    password = fake.random_int(min=0, max=9999)
    token = requests.post(url, json={'Username': username,'Email Address': email,'Password': password}).text.split()[-2]

    user = {
        "Username": username,
        "Email Address": email,
        "Password": password,
        "Token": token
    }

    return user

Однако, когда я его запускаю. Я получаю сообщение об ошибке:

    def delete_user(self):
>       return requests.delete(self.url, headers=self.headers).text
E       AttributeError: 'dict' object has no attribute 'url'

Я не могу использовать self.url? Мне не нужно было переопределять его в каждом определении, поскольку конечная точка одинакова для каждого теста.

1 Ответ

1 голос
/ 07 февраля 2020

Вы вызываете функцию delete_user для всего класса, а не для определенного экземпляра c класса. Также чаще вводить имена классов в верхнем регистре, поэтому имя класса будет Users, а не user. Чтобы создать экземпляр класса Users, вы должны сделать users = Users(user_with_token).

Когда вы вызываете функцию delete_user в классе (а не в экземпляре класса), используя users.delete_user(user_with_token), user_with_token dict передается в качестве параметра self методу, откуда и происходит ошибка. Когда вы вместо этого вызываете функцию для указанного экземпляра c, Python автоматически сделает параметр self экземпляром.

Когда вы используете класс, вы должны сделать что-то вроде следующего (этот код предполагает, что вы переименовали свой класс с users на Users кстати:

from endpoints.users import users

def get_all_users(user_with_token):
    users = Users(user_with_token)
    result = users.get_all_users()
    assert result == 200

def test_delete_all_users(user_with_token):
    users = Users(user_with_token)
    result = users.delete_user()
    assert "Current user deleted" in result

Обратите внимание, что вместо users.delete_user(user_with_token) метод просто вызывается с users.delete_user(), как ваш delete_user метод ожидает только один параметр - self, а не два (self и user_with_token). Как только вы создадите экземпляр класса Users, он будет включать данные из user_with_token, поэтому нет Также необходимо передать эти данные в функции delete_user и get_all_users.

...