Ошибка при тестировании приложения flask с unittest - PullRequest
1 голос
/ 05 февраля 2020

У меня есть

ModuleNotFoundError: Ни один модуль с именем 'project'

при попытке запустить test_req.py Моя структура проекта:

├── instance/
│   ├── flask.cfg
├── project/
│   ├── __init__.py
│   ├── base_processing.py
│   ├── models.py
|   ├── views.py
│   ├── templates/
│   │   ├── base.html
│   │   ├── login.html
│   │   ├── note.html
│   │   ├── notes.html
│   └── static/
│   │ 
│   └── tests/
│       ├── test_req.html
├── run.py

Мой файл UnitTest:

# project/test_req.py

    import unittest
    import os

    from project import app
    from project.models import db, User, Note
    from project.views import *

    TEST_DB = 'test.db'

    class RequestTests(unittest.TestCase):

        @classmethod
        def setUpClass(cls):
            app.config['TESTING'] = True
            app.config['WTF_CSRF_ENABLED'] = False
            app.config['DEBUG'] = False
            app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + \
                os.path.join(app.config['BASEDIR'], TEST_DB)
            app.secret_key = 'staytrue'
            cls.app = app.test_client()

        def setUp(self):
            db.create_all()

        def tearDown(self):
            db.drop_all()


        def test_main_page(self):
            response = self.app.get('/', follow_redirects=True)
            self.assertEqual(response.status_code, 200)

        def test_auth(self):
            u = User(username='testname1', password='1234567', email='cyber@mail.com')
            db.session.add(u)
            db.session.commit()
            response = self.app.post('/login', data=dict(username='testname1', password='1234567'), follow_redirects=True)
            with self.app.session_transaction() as sess:
                self.assertEqual(sess['username'], 'testname1')


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

Также мой тест прекрасно работает с nose2, когда я запускаю его из каталога root. Также это первый раз, когда я так организовываю макет своего проекта.

1 Ответ

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

Модуль - это не папка, это должен быть файл .py. Поскольку у вас нет файла project.py, вы не должны указывать from project import app.

. Указание from project import app означает, что существует файл project.py, и вы хотите импортировать класс app из этого файла.

, если ваши файлы test_req.py и app.py находятся в одной папке, просто используйте: import app в вашем test_req.py

Также замените:

from project.models import db, User, Note
from project.views import *

до

from models import db, User, Note
from views import *

Дополнительная информация:

Кроме того, я бы порекомендовал использовать PyCharm Community Edition , он бесплатный, многофункциональный и с открытым исходным кодом, и поможет вам решать такие задачи всего двумя щелчками мыши.


Предположим, у нас есть следующая структура проекта в папке root нашего проекта:

/folder1/MyPythonFile1.py
/folder1/folder11/MyPythonFile2.py
/folder2/MyApp.py

project structure

/folder1/MyPythonFile1.py файл выглядит так:

class Class1:
    def __init__(self):
        pass


class Class2:
    def __init__(self):
        pass

И /folder1/folder11/MyPythonFile2.py файл выглядит так:

class Class3:
    def __init__(self):
        pass

Файл /folder2/MyApp.py использует классы из вышеупомянутых файлов и выглядит так:

from folder1.MyPythonFile1 import Class1
from folder1.folder11.MyPythonFile2 import Class3

obj1 = Class1()
obj3 = Class3()

Примените этот пример к вашему конкретному случаю и соответствующим образом обновите ваш импорт.

...