mr_*_*thi 0 python unit-testing flask
我有一个非常原始的 Flask 应用程序,它按我的预期工作,但我无法为其编写单元测试。该应用程序的代码如下(我省略了无关紧要的部分):
\n\napp.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\nRun Code Online (Sandbox Code Playgroud)\n\n测试是:
\n\ntests.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()\nRun Code Online (Sandbox Code Playgroud)\n\n回溯:
\n\nERROR: 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)\nRun Code Online (Sandbox Code Playgroud)\n\n谢谢你的时间。
\n您发布的代码有一些问题(除了缩进):
\n\n首先,在tests.py您中import app并使用它,但它app是模块而不是app来自的对象app.py。您应该使用导入实际app对象
from app import app\nRun Code Online (Sandbox Code Playgroud)\n\n其次,您使用该app对象(假设我们修复导入)作为另一个Flask()构造函数\xe2\x80\x94的参数,本质上是说:
app = Flask(Flask(app))\nRun Code Online (Sandbox Code Playgroud)\n\n由于我们已经app从导入app.py,我们可以直接使用它,因此我们删除该app = Flask(app)行(以及关联的import语句,因为我们不再需要它),您的测试文件将变为:
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()\nRun Code Online (Sandbox Code Playgroud)\n\n您还应该注意,from flask import *不鼓励使用该表单来导入模块的特定部分,因此
from flask import Flask, jsonify\nRun Code Online (Sandbox Code Playgroud)\n\n在你的 中会更好app.py。