Error while testing flask application with unittest

社会主义新天地 提交于 2021-01-28 11:44:00

问题


I have

ModuleNotFoundError: No module named 'project'

while trying to run test_req.py My project structure is:

├── 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

My UnitTest file is:

# 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()

Also my test work just fine with nose2, when I run it from my root directory. Also this is the first time I'm organizing my project layout this way.


回答1:


Module is not a folder, it should be a .py file. As you don't have project.py file, you should not specify from project import app.

Specifying from project import app means that there is project.py file and you want to import class app from this file.

if your test_req.py and app.py files are located in the same folder, then just use: import app in your test_req.py

Also replace:

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

to

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

Further reading:

  • Python modules

  • Importing

Also, I would recommend to use PyCharm Community Edition, it is free, multilpatform and open source, and will help you to solve such tasks just via two mouse clicks.


Assume we have the following project structure in the root folder of our project:

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

/folder1/MyPythonFile1.py file looks like that:

class Class1:
    def __init__(self):
        pass


class Class2:
    def __init__(self):
        pass

And /folder1/folder11/MyPythonFile2.py file looks like that:

class Class3:
    def __init__(self):
        pass

File /folder2/MyApp.py uses classes from aforecited files and looks like that:

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

obj1 = Class1()
obj3 = Class3()

Apply this example to your particular case and update your imports accordingly.



来源:https://stackoverflow.com/questions/60069910/error-while-testing-flask-application-with-unittest

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!