2016-09-28 48 views
0

我有一个非常原始的瓶应用程序,它可以像我期待的那样工作,但我没有为它编写单元测试。该应用程序的代码如下(我省略微不足道的一部分):单元测试问题的小瓶应用程序

app.py 

from flask import * 
import random 
import string 

app = Flask(__name__) 
keys = [] 
app.testing = True 

@app.route('/keygen/api/keys', methods=['POST']) 
def create(): 
    symbol = string.ascii_letters + string.digits 
    key = ''.join(random.choice(symbol) for _ in range(4)) 
    key_instance = {'key': key, 'is_used': False} 
    keys.append(key_instance) 

    return jsonify({'keys': keys}), 201 

测试是:

tests.py 

import unittest 
from flask import * 
import app 

class TestCase(unittest.TestCase): 
    def test_number_one(self): 
     test_app = Flask(app) 
     with test_app.test_client() as client: 
      rv = client.post('/keygen/api/keys') 

     ...something... 

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

回溯:

ERROR: test_number_one (__main__.TestCase) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "tests.py", line 12, in test_number_one 
    test_app = Flask(app) 
    File "/Users/bulrathi/Yandex.Disk.localized/Virtualenvs/ailove/lib/python3.5/site-packages/flask/app.py", line 346, in __init__ 
    root_path=root_path) 
    File "/Users/bulrathi/Yandex.Disk.localized/Virtualenvs/ailove/lib/python3.5/site-packages/flask/helpers.py", line 807, in __init__ 
    root_path = get_root_path(self.import_name) 
    File "/Users/bulrathi/Yandex.Disk.localized/Virtualenvs/ailove/lib/python3.5/site-packages/flask/helpers.py", line 668, in get_root_path 
    filepath = loader.get_filename(import_name) 
    File "<frozen importlib._bootstrap_external>", line 384, in _check_name_wrapper 
ImportError: loader for app cannot handle <module 'app' from '/Users/bulrathi/Yandex.Disk.localized/Обучение/Code/Django practice/ailove/keygen/app.py'> 

---------------------------------------------------------------------- 
Ran 1 test in 0.003s 

FAILED (errors=1) 

感谢您的时间。

+1

在测试中,当'app'已经是'Flask'的一个实例时,''test_app''初始化为'Flask(app)',实质上是'test_app = Flask(Flask(app))'。尝试删除这一行,并用app.test_client()作为客户端替换'with'行。'。 – kfb

+0

我得到了'AttributeError:模块'app'没有'test_client'属性 –

+0

你也需要在你的测试中添加'app ['TESTING'] = True'。 – kfb

回答

2

你必须与发布代码的几个问题(压痕除外):

首先,在tests.pyimport app和使用它,但app是模块,而不是从app.pyapp对象。你应该作为一个参数导入使用

from app import app 

,其次实际app对象,您使用的是app对象(假设我们固定进口)到另一个Flask()构造,基本上等于在说:

app = Flask(Flask(app)) 

由于我们已经从app.py导入app,我们可以直接使用它,所以我们删除了app = Flask(app)行(以及相关联的import声明,因为我们不再需要它),并且您的测试文件变为:

import unittest 
from app import app 

class TestCase(unittest.TestCase): 
    def test_number_one(self): 
     with app.test_client() as client: 
     rv = client.post('/keygen/api/keys') 

    ...something... 

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

你也应该注意到,from flask import *形式有利于导入模块的特定部分的劝阻,所以

from flask import Flask, jsonify 

将是您的app.py更好。