Flask测试create_app没有返回应用程序?

时间:2017-03-24 05:15:42

标签: python flask python-unittest flask-testing

我正在研究我的烧瓶项目中的单元测试。我的测试文件如下:

import flask_testing
import unittest
from flask import Flask
from flask_testing import TestCase

class MyTest(TestCase):

    def setUp(self):
        pass # Executed before each test

    def tearDown(self):
        pass # Executed after each test

    def create_app(self):
        app = Flask(__name__)
        # app.config['TESTING'] = True
        return app

    def test_greeting(self):
        response = self.client.get('/')
        print("should return 404 on landing page")
        self.assertTemplateUsed('index.html')
        self.assertEqual(response.status_code, 200)

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

当我运行这些测试时,assertTemplateUsed不返回模板而response.status_code是404.我想这是因为self出于某种原因实际上并不是我的应用程序?当我运行应用程序时,根地址肯定会返回index.html。

我设置create_app错了吗?任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

在setUp函数中,您需要提供一个测试客户端来发出请求。尝试这样的事情。

def setUp(self):
    # this test client is what flask-testing will use to make your requests
    self.app = app.test_client()

查看此信息以获取更多信息How to Test a Flask Application

答案 1 :(得分:0)

您需要在setUp()功能中创建Flask应用实例。目前create_app()函数根本没有被调用。

更改您的代码:

import flask_testing
import unittest
from flask import Flask
from flask_testing import TestCase

class MyTest(TestCase):

    def setUp(self):
        self.app = Flask(__name__)
        self.app_context = self.app.app_context()
        self.app_context.push()
        self.client = self.app.test_client(use_cookie=True)

    def tearDown(self):
        self.app_context.pop()

    def test_greeting(self):
        response = self.client.get('/')
        print("should return 404 on landing page")
        self.assertTemplateUsed('index.html')
        self.assertEqual(response.status_code, 200)

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

在每个测试函数之前调用setUp()函数。首先,您将创建Flask应用程序的新实例。如果您想访问应用程序上下文中的项目,最好将其推送到setUp()函数中并将其弹出tearDown()函数。如果你不这样做,你可以把它留下来。从您的测试函数访问app_context项(如数据库会话对象)。最后,您需要在setUp()函数中创建测试客户端。你在帖子中错过了那个部分,但我想你是在代码中的其他地方做的。