簡體   English   中英

AttributeError: 'dict' 對象沒有屬性 'url'

[英]AttributeError: 'dict' object has no attribute 'url'

我正在 pytest 中編寫一些 API 測試,它們接收從實用程序類生成的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嗎? 我不想在每個定義中重新聲明它,因為每個測試的端點都是相同的。

您正在整個類上調用delete_user函數,而不是類的特定實例。 此外,使類名大寫更為常見,因此類名將是Users而不是user 要創建Users類的實例,您可以執行users = Users(user_with_token)

當您使用users.delete_user(user_with_token)在類(而不是類的實例)上調用delete_user函數時, user_with_token dict 將作為self參數傳遞給方法,這就是錯誤的來源。 當您在特定實例上調用該函數時,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) ,而是簡單地使用delete_user users.delete_user()調用,因為您的delete_user方法只需要一個參數 - self ,而不是兩個( selfuser_with_token )。 創建Users類的實例后,它將包含來自user_with_token的數據,因此無需將該數據也傳遞給delete_userget_all_users函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM