python - Flask 应用单元测试期间无法创建测试客户端

标签 python unit-testing flask

我正在尝试了解如何对从 session['user_id'] 获取变量值的函数运行测试。这是具体的测试方法:

def test_myProfile_page(self):
    with app.test_client() as c:
        with c.session_transaction() as sess:
            sess['user_id'] = '1'

    rv = c.get('/myProfile')
    assert 'My Profile' in rv.data

这是被测试的 View :

@app.route('/myProfile')
def myProfile():
    if not session.get('logged_in'):
        return render_template('login.html')
    else:
        profileID = session['user_id']
        userList = users.query.filter_by(id=profileID).all()
        flash('My Profile')
        return render_template('myProfile.html', userList=userList)

这是整个测试文件:

import os
import app
import unittest
import tempfile

class AppTestCase(unittest.TestCase):
    def setUp(self):
        self.db_fd, app.app.config['DATABASE'] = tempfile.mkstemp()
        app.app.config['TESTING'] = True
        self.app = app.app.test_client()

    def tearDown(self):
        os.close(self.db_fd)
        os.unlink(app.app.config['DATABASE'])

    def test_profile_page(self):
        rv = self.app.get('/profile1')
        assert 'Profile' in rv.data

    def login(self, username, password):
        return self.app.post('/login', data=dict(
            username=username,
            password=password
        ), follow_redirects=True)

    def logout(self):
        return self.app.get('/logout', follow_redirects=True)

    def test_login_logout(self):
        rv = self.login('Alex', 'passwordAlex')
        assert 'Welcome' in rv.data
        rv = self.logout()
        assert 'You have been logged out' in rv.data
        rv = self.login('Alex', 'noPassword')
        assert 'You have to Login' in rv.data
        rv = self.login('WrongName', 'passwordAlex')
        assert 'You have to Login' in rv.data

    def test_myProfile_page(self):
        with app.test_client() as c:
            with c.session_transaction() as sess:
                sess['user_id'] = '1'

        rv = c.get('/myProfile')
        assert 'My Profile' in rv.data

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

运行测试时出现如下错误:

ERROR: test_myProfile_page (__main__.AppTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "app_tests.py", line 46, in test_myProfile_page
    with app.test_client() as c:
AttributeError: 'module' object has no attribute 'test_client'

----------------------------------------------------------------------
Ran 3 tests in 0.165s


FAILED (errors=1)

为什么会出现此错误以及如何解决?

最佳答案

您已经在 setUp 方法中创建了一个测试客户端:self.appapp 是您在顶部导入的模块,您需要在 app.app 中引用 app 对象才能访问 Flask 应用程序。由于您已经创建了一个测试客户端,因此您可以将测试更改为:

def test_myProfile_page(self):
    with self.app as c:
        with self.app.session_transaction() as sess:
            sess['user_id'] = 1
            sess['logged_in'] = True
            rv = self.app.get('myProfile')
    assert 'My Profile' in rv.data

关于python - Flask 应用单元测试期间无法创建测试客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28027583/

相关文章:

python - Flask-sqlalchemy;通过外键列表过滤查询

python arg 在 shell 命令中转义(调用 avconv)

python - 如何从 ZOPE 产品直接查询关系/SQL 数据库?

c# - Resharper 测试运行器不输出 Console.WriteLine()?

asp.net-mvc - 测试从 ASP.NET MVC 应用程序返回的 HTTP header

python - 如何在 `flask-admin` 中强制执行约束?

python - 如何从 Google App Engine 上的 URL 将文件存储在 Google Storage 上?

python - 用 Python 抓取 html 或

c# - 有没有更合适的方法来测试构造函数是否抛出异常?

javascript - python Flask 动态下拉列表