Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 单元测试烧瓶应用程序-在应用程序中模拟全局变量_Python_Flask_Python Unittest - Fatal编程技术网

Python 单元测试烧瓶应用程序-在应用程序中模拟全局变量

Python 单元测试烧瓶应用程序-在应用程序中模拟全局变量,python,flask,python-unittest,Python,Flask,Python Unittest,我有一个Flask应用程序模块(app.py),看起来像这样 # imports ... from flask import Flask, request, Response ... # module-level vars, including `logger` and `APP` ... logger = None APP = None ... def init(): """ Initialisation of app resources, including `logge

我有一个Flask应用程序模块(
app.py
),看起来像这样

# imports
...
from flask import Flask, request, Response
...

# module-level vars, including `logger` and `APP`
...
logger = None
APP = None
...

def init():
    """
    Initialisation of app resources, including `logger`
    """
    ...
    APP = Flask(__name__) 
    ...
    logger = logging.getLogger()
    ...
    ...

try:
    init()
except Exception as e:
    logger.error(str(e))

@APP.route('/healthcheck', methods=['GET'])
def healthcheck():
    """
    Healthcheck endpoint - just returns OK if the app
    initialised OK.
    """
    return 'OK'

@APP.route('/get_keys', method=['POST'])
def get_keys():
    """
    Main endpoint - accepts a POST request from a client
    containing either a CSV or JSON payload defining a set
    of geographic locations, and then returns some "keys"
    for these.
    """
    try:
        logger.info('Extracting payload')
        # extract payload
        logger.info('Processing for keys')
        # do some stuff
        ...
        ...
    except Exception as e:
        logger.error("Error: {}.".format(str(e)))

    # return response
我在
tests
子包中的模块
AppTests
中定义了Flask应用程序的单元测试

# general imports including `unittest` etc.
# import app module as `app`

class AppTests(unittest.TestCase):
    """
    Flask app tests
    """

    @classmethod
    def setUpClass(self):

        app.APP.config['TESTING'] = True
        app.APP.config['DEBUG'] = False

        self.app = app.APP.test_client()

        # define other resources needed for `self.app`


    def test_healthcheck(self):

        res = self.app.get(path='/healthcheck')

        self.assertEqual(res.status_code, 200)

    def test_get_keys__csv(self):

        # define sample csv data in `data` variable

        headers = {
            'Accept-Encoding': 'identity,deflate,gzip,compress',
            'Content-Type': 'text/csv; charset=utf-8',
            'Content-Length': len(data)
        }

        res = self.app.post(path='/get_keys', headers=headers.items(), data=data)

        self.assertEqual(res.status_code, 200)
healthcheck
端点的测试通过,但
get_key
端点的测试失败

$ python -m unittest -v AppTests.AppTests.test_get_keys__csv
test_get_keys__csv (AppTests.AppTests) ... 
ERROR

======================================================================
ERROR: test_get_keys__csv (AppTests.AppTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "AppTests.py", line 105, in test_get_keys__csv
    res = self.app.post(path='/get_keys', headers=headers.items(), data=data)
  File "/path/to/venv/lib/python2.7/site-packages/werkzeug/test.py", line 801, in post
    return self.open(*args, **kw)
  File "/path/to/venv/lib/python2.7/site-packages/flask/testing.py", line 127, in open
    follow_redirects=follow_redirects)
  File "/path/to/venv/lib/python2.7/site-packages/werkzeug/test.py", line 764, in open
    response = self.run_wsgi_app(environ, buffered=buffered)
  File "/path/to/venv/lib/python2.7/site-packages/werkzeug/test.py", line 677, in run_wsgi_app
    rv = run_wsgi_app(self.application, environ, buffered=buffered)
  File "/path/to/venv/lib/python2.7/site-packages/werkzeug/test.py", line 884, in run_wsgi_app
    app_rv = app(environ, start_response)
  File "/path/to/venv/lib/python2.7/site-packages/flask/app.py", line 1994, in __call__
    return self.wsgi_app(environ, start_response)
  File "/path/to/venv/lib/python2.7/site-packages/flask/app.py", line 1985, in wsgi_app
    response = self.handle_exception(e)
  File "/path/to/venv/lib/python2.7/site-packages/flask/app.py", line 1540, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/path/to/venv/lib/python2.7/site-packages/flask/app.py", line 1982, in wsgi_app
    response = self.full_dispatch_request()
  File "/path/to/venv/lib/python2.7/site-packages/flask/app.py", line 1614, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/path/to/venv/lib/python2.7/site-packages/flask/app.py", line 1517, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/path/to/venv/lib/python2.7/site-packages/flask/app.py", line 1612, in full_dispatch_request
    rv = self.dispatch_request()
  File "/path/to/venv/lib/python2.7/site-packages/flask/app.py", line 1598, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/path/to/app.py", line 205, in get_keys
    logger.error("Error: {}.".format(str(e)))
AttributeError: 'NoneType' object has no attribute 'error'

----------------------------------------------------------------------
Ran 1 test in 0.036s

FAILED (errors=1)
调用
self.app.post('/get\u-keys,headers=headers.items(),data=data)
时,应用程序中
get\u-keys
端点中对
logger
对象的引用似乎为空。每次调用
logger.info
都会在端点中生成一个异常,该异常会被捕获并记录下来,这就是我在运行端点测试时看到的


有没有一种方法可以模拟这种情况,或者如何绕过测试模块本身使用的
logger
?我不希望修改端点方法本身。

在运行
test\u get\u keys\u csv()
时,您可能会模拟日志导入

如果您使用的是Python2,
mock
是一个单独的安装

pip install mock
然后用

from mock import patch
有关模拟的更多信息:

from mock import patch