#python #unit-testing #flask
#python #модульное тестирование #flask
Вопрос:
Я пишу тест для flask API, в котором пользователь может создать учетную запись. После запуска теста (unittest) Я продолжаю получать эту ошибку. Есть ли лучший способ протестировать этот API ie, который я также могу использовать для тестирования запросов GET, PUT и DELETE?
Ошибка типа: self.assertEqual(результат[«id»], «4») объект ‘method’ не поддается подписке
Вот моя настройка базы данных:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
public_id = db.Column(db.String(50), unique = True)
name = db.Column(db.String(50))
password = db.Column(db.String(80))
admin = db.Column(db.Boolean)
API, который я хочу протестировать:
@APP.route('/user', methods = ['POST'])
def create_user():
data = request.get_json(force = True)
hashedpassword = generate_password_hash(data['password'], method= 'sha256')
new_user = User(public_id = str(uuid.uuid4), name = data['name'], password = hashedpassword, admin = False)
db.session.add(new_user)
db.session.commit()
Мой тест:
class testMainmodule(unittest.TestCase):
def setUp(self):
APP.testing = True
self.app = APP.test_client()
self.data = {"admin": False,
"id": "4",
"name": "njati",
"password": "sha256$xfIUTEIX$6973717971585c3b7ebb593876def4124ff3eb4f8e30c3b43e2c8af20fe64952",
"public_id": "<function uuid4 at 0x7fb631f93d08>"}
def post_create_user(self, data = {}):
if not data:
data = self.data
result= self.app.post(path = "/user", data = json.dumps(self.data), content_type = "application/json")
json_response = json.loads(result.get_data(as_text=True))
return jsonify(json_response)
def test_create_user(self):
result = self.post_create_user
self.assertEqual(result["id"], "4")
self.assertEqual(result["public_id"], "<function uuid4 at 0x7fb631f93d08>")
self.assertTrue(result["admin"], False)
self.assertEqual(result["name"], "njati")
self.assertEqual(result["password"], "sha256$xfIUTEIX$6973717971585c3b7ebb593876def4124ff3eb4f8e30c3b43e2c8af20fe64952")
self.assertEqual(response.status_code, 201)
Ответ №1:
Ваш код не вызывает create_user, он указывает на метод create_user. Вот почему вы получаете
TypeError: self.assertEqual(result["id"], "4") 'method' object is not subscriptable
Попробуйте
result = self.post_create_user()
self.assertDictEqual(result,self.data)
# You will face an issue with the line below since response is not defined
self.assertEqual(response.status_code, 201)
Не
result = self.post_create_user
Комментарии:
1. Я сделал именно это, но получаю другую ошибку: RuntimeError: работает вне контекста приложения. Обычно это означает, что вы пытались использовать функциональность, которая должна была каким-то образом взаимодействовать с текущим объектом приложения. Чтобы решить эту проблему, настройте контекст приложения с помощью app.app_context(). Смотрите документацию для получения дополнительной информации.
2. @Вилли Нджати. Это другая тема. Если ваш модульный тестовый код начнет работать, вам лучше закрыть этот пост и создать новый, посвященный проблеме Flask, с которой вы столкнулись. Добавьте трассировку стека Flask.
Ответ №2:
Возможно, это небольшая доработка ответа, уже данного @balderman, но вот причина:
result["id"]
результатом является переменная, которая содержит метод класса, методы таким образом не используются.
при объявлении result = self.post_create_user
python предполагает, что post_create_user является свойством, которое нельзя вызвать с аргументами. Но поскольку это метод, вы должны использовать self.post_create_user() вместо этого, и когда вы передаете его в качестве аргумента (без круглых скобок), вы должны указать второй аргумент в качестве его аргумента (см. Ответ Балдермана выше)