Сбой теста в Flask модульном тесте с ошибкой 404 - PullRequest
0 голосов
/ 27 февраля 2020

Я запускаю модульное тестирование для тестирования API, который отлично работает при тестировании с Postman. API принимает два параметра в форме {"body":"hey","title":"title"} и добавляет эти значения в базу данных на основе созданных мной моделей. Ответ возвращается в аналогичном формате с дополнительным ключом id, полученным из базы данных. Дело в том, что он отлично работает с почтальоном. Однако при тестировании с использованием Pytest просто не работает.

Вот код в файле теста.

import os
import unittest
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# from flask_backend import app
# from flask_backend.core import db


class BasicTests(unittest.TestCase):
    app = Flask(__name__)
    db = SQLAlchemy(app)

    def setUp(self):
        file_path = os.path.abspath(os.getcwd()) + "\database_test.db"
        self.app.config['TESTING'] = True
        self.app.config['DEBUG'] = False
        self.app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + file_path
        self.app = self.app.test_client()
        self.db.drop_all()
        self.db.create_all()

    def tearDown(self):
        self.db.session.remove()


class TestApi(BasicTests):

    def test_add_post(self):
        url = 'http://127.0.0.1:5000'
        parameters = {'body': 'Body', 'title': 'title'}
        response = self.app.post(url+'/api/dbapi/post/', data=parameters)
        print(self.app)
        self.assertEqual(response.status_code, 200)


if __name__ == '__main__':
    unittest.main()

Я думаю, что во время выполнения теста сервер не запускается и, следовательно, возникает ошибка 404.

Причина, по которой я не импортирую переменную приложения из самого проекта, заключается в том, что модуль не импортируется. Я задал вопрос в другой ветке. Вот ссылка на него: Невозможно импортировать файлы из родительского каталога, даже если в нем есть файл __init__.py

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

1 Ответ

0 голосов
/ 02 марта 2020

Вот как я решил проблему. Таким образом, очевидно, что необходимо было запустить сервер, чтобы API был доступен, а тест - успешным.

Итак, я добавил app.run() в конце кода, и он работал нормально. Вот как это выглядит


    if __name__ == '__main__':
        unittest.main()
        app.run()

...