Протестируйте API Flask, использующий базу данных sqlite

Я пишу тест для фляжного API, где пользователь может создать учетную запись. После запуска теста (unittest) я продолжаю получать эту ошибку. Есть ли лучший способ протестировать этот API, т.е. который я также могу использовать для проверки запросов GET, PUT и DELETE?

Ошибка типа: self.assertEqual (результат ["id"], "4") объект «метод» не подлежит подписке

Вот моя настройка базы данных:

    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)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
303
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ваш код не вызывает 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

Я сделал именно это, но получаю другую ошибку: RuntimeError: Работа вне контекста приложения. Обычно это означает, что вы пытались использовать функциональные возможности, которые каким-то образом должны были взаимодействовать с текущим объектом приложения. Чтобы решить эту проблему, настройте контекст приложения с помощью app.app_context(). См. документацию для получения дополнительной информации.

Willie Njati 07.04.2019 17:09

@Вилли Нджати. Это отдельная тема. Если ваш модульный тестовый код начинает работать, вам лучше закрыть этот пост и создать новый, посвященный проблеме Flask, с которой вы столкнулись. Добавьте трассировку стека Flask.

balderman 07.04.2019 19:43

Возможно, это немного уточнение ответа, уже данного @balderman, но вот причина:

result["id"]

result — это переменная, содержащая метод класса, методы таким образом не используются.

когда вы объявляете result = self.post_create_user, python предполагает, что post_create_user — это свойство, которое нельзя вызывать с аргументами. Но поскольку это метод, вместо этого вы должны использовать self.post_create_user(), и когда вы передаете его в качестве аргумента (без круглых скобок), вы должны указать второй аргумент в качестве его аргумента (см. ответ балдермана выше)

Другие вопросы по теме