小型 Flask 应用程序的单元测试问题

mr_*_*thi 0 python unit-testing flask

我有一个非常原始的 Flask 应用程序,它按我的预期工作,但我无法为其编写单元测试。该应用程序的代码如下(我省略了无关紧要的部分):

\n\n
app.py\n\nfrom flask import *\nimport random\nimport string\n\napp = Flask(__name__)\nkeys = []\napp.testing = True\n\n@app.route(\'/keygen/api/keys\', methods=[\'POST\'])\ndef create():\n    symbol = string.ascii_letters + string.digits\n    key = \'\'.join(random.choice(symbol) for _ in range(4))\n    key_instance = {\'key\': key, \'is_used\': False}\n    keys.append(key_instance)\n\n    return jsonify({\'keys\': keys}), 201\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试是:

\n\n
tests.py\n\nimport unittest\nfrom flask import *\nimport app\n\nclass TestCase(unittest.TestCase):\n    def test_number_one(self):\n        test_app = Flask(app)\n        with test_app.test_client() as client:\n            rv = client.post(\'/keygen/api/keys\')\n\n        ...something...\n\n    if __name__ == \'__main__\':\n    unittest.main()\n
Run Code Online (Sandbox Code Playgroud)\n\n

回溯:

\n\n
ERROR: test_number_one (__main__.TestCase)\n----------------------------------------------------------------------\nTraceback (most recent call last):\n  File "tests.py", line 12, in test_number_one\n    test_app = Flask(app)\n  File "/Users/bulrathi/Yandex.Disk.localized/Virtualenvs/ailove/lib/python3.5/site-packages/flask/app.py", line 346, in __init__\n    root_path=root_path)\n  File "/Users/bulrathi/Yandex.Disk.localized/Virtualenvs/ailove/lib/python3.5/site-packages/flask/helpers.py", line 807, in __init__\n    root_path = get_root_path(self.import_name)\n  File "/Users/bulrathi/Yandex.Disk.localized/Virtualenvs/ailove/lib/python3.5/site-packages/flask/helpers.py", line 668, in get_root_path\n    filepath = loader.get_filename(import_name)\n  File "<frozen importlib._bootstrap_external>", line 384, in _check_name_wrapper\nImportError: loader for app cannot handle <module \'app\' from \'/Users/bulrathi/Yandex.Disk.localized/\xd0\x9e\xd0\xb1\xd1\x83\xd1\x87\xd0\xb5\xd0\xbd\xd0\xb8\xd0\xb5/Code/Django practice/ailove/keygen/app.py\'>\n\n----------------------------------------------------------------------\nRan 1 test in 0.003s\n\nFAILED (errors=1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

谢谢你的时间。

\n

kfb*_*kfb 6

您发布的代码有一些问题(除了缩进):

\n\n

首先,在tests.py您中import app并使用它,但它app是模块而不是app来自的对象app.py。您应该使用导入实际app对象

\n\n
from app import app\n
Run Code Online (Sandbox Code Playgroud)\n\n

其次,您使用该app对象(假设我们修复导入)作为另一个Flask()构造函数\xe2\x80\x94的参数,本质上是说:

\n\n
app = Flask(Flask(app))\n
Run Code Online (Sandbox Code Playgroud)\n\n

由于我们已经app从导入app.py,我们可以直接使用它,因此我们删除该app = Flask(app)行(以及关联的import语句,因为我们不再需要它),您的测试文件将变为:

\n\n
import unittest\nfrom app import app\n\nclass TestCase(unittest.TestCase):\n    def test_number_one(self):\n        with app.test_client() as client:\n        rv = client.post('/keygen/api/keys')\n\n    ...something...\n\nif __name__ == '__main__':\n    unittest.main()\n
Run Code Online (Sandbox Code Playgroud)\n\n

您还应该注意,from flask import *不鼓励使用该表单来导入模块的特定部分,因此

\n\n
from flask import Flask, jsonify\n
Run Code Online (Sandbox Code Playgroud)\n\n

在你的 中会更好app.py

\n