gpt4 book ai didi

python - "RuntimeError: working outside of application context"使用 py.test 进行单元测试时

转载 作者:太空狗 更新时间:2023-10-30 00:24:14 26 4
gpt4 key购买 nike

我正在尝试迁移到 py.test 以便于使用和自动发现测试。当我使用 unittest 运行测试时,测试工作正常。当我在 py.test 下运行测试时,我得到 RuntimeError: working outside of application context

这是测试代码(test_app.py):

import unittest

from app import app

class TestAPILocally(unittest.TestCase):
def setUp(self):
self.client = app.test_client()

def testRoot(self):
retval = self.client.get('/').data
self.assertTrue('v1' in retval)

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

这是我正在测试的精简文件 (app.py):

from flask import Flask
from flask.ext.restful import Api, Resource

class APIListAPI(Resource):
def get(self):
return ['v1']

app = Flask(__name__)
api = Api(app)
api.add_resource(APIListAPI, '/')

如您所见,这与 flask 站点上的文档非常相似:the testing skeleton ,事实上,当我用 unittest 运行它时,它成功了:

$ python tmp1/test_app.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.115s

OK
$

但是,当我使用 py.test 进行测试时,它失败了:

$ ./py.test tmp1/test_app.py
=================== test session starts =========================
platform sunos5 -- Python 2.7.5 -- py-1.4.22 -- pytest-2.6.0
collected 1 items

tmp1/test_app.py F

========================= FAILURES ==============================
_________________ TestAPILocally.testRoot _______________________

self = <tmp1.test_app.TestAPILocally testMethod=testRoot>

def testRoot(self):
> retval = self.client.get('/').data

tmp1/test_app.py:10:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
werkzeug/test.py:762: in get
return self.open(*args, **kw)
flask/testing.py:108: in open
follow_redirects=follow_redirects)
werkzeug/test.py:736: in open
response = self.run_wsgi_app(environ, buffered=buffered)
werkzeug/test.py:659: in run_wsgi_app
rv = run_wsgi_app(self.application, environ, buffered=buffered)
werkzeug/test.py:855: in run_wsgi_app
app_iter = app(environ, start_response)
tmp1/flask/app.py:1836: in __call__
return self.wsgi_app(environ, start_response)
tmp1/flask/app.py:1820: in wsgi_app
response = self.make_response(self.handle_exception(e))
flask_restful/__init__.py:256: in error_router
if self._has_fr_route():
flask_restful/__init__.py:237: in _has_fr_route
if self._should_use_fr_error_handler():
flask_restful/__init__.py:218: in _should_use_fr_error_handler
adapter = current_app.create_url_adapter(request)
werkzeug/local.py:338: in __getattr__
return getattr(self._get_current_object(), name)
werkzeug/local.py:297: in _get_current_object
return self.__local()
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

def _find_app():
top = _app_ctx_stack.top
if top is None:
> raise RuntimeError('working outside of application context')
E RuntimeError: working outside of application context

flask/globals.py:34: RuntimeError
================ 1 failed in 1.02 seconds ======================

现在,事实证明,我只需执行以下操作就可以通过此测试:

$ rm tmp1/__init__.py

并通过这样做使其再次失败:

$ touch tmp1/__init__.py

那么,unittest 和 py.test 处理模块中文件的方式有什么区别吗?看起来很奇怪,它崩溃到足以让 Flask 提示,因为我显然 在调用 app.test_client().get() 的应用程序上下文中。这是预期的行为,还是我应该针对 py.test 提交错误?

万一它是相关的,我从父目录执行测试的原因是因为我没有能力将模块添加到站点包,所以我从父目录启动我的所有代码,我在其中安装了 Flask、py.test 等。

编辑:已解决。这是一个安装问题。添加 pythonpath 标记,因为这是解决方案。

最佳答案

不直接回答 TS 问题,但主要针对“应用程序上下文”错误。

在 setUp 和 tearDown 函数中添加推送和弹出上下文应该有助于解决此错误:

def setUp(self):
self.app_context = app.app_context()
self.app_context.push()

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

您可以在此处找到有关 Flask 上下文的更多信息:

同样在 Daniel Kronovet 的这篇精彩文章中:

PS 如果您计划在测试中使用 url_for,则需要额外的配置:

@classmethod
def setUpClass(cls)
app.config['SERVER_NAME'] = 'localhost:5000'

例子

class ViewsTestCase(unittest.TestCase):
@classmethod
def setUpClass(cls):
app.config['SERVER_NAME'] = 'localhost:5000'
cls.client = app.test_client()

def setUp(self):
self.app_context = app.app_context()
self.app_context.push()

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

def test_view_should_respond(self):
r = self.client.get(url_for("index"))
self.assertEqual(r.status_code, 200)

关于python - "RuntimeError: working outside of application context"使用 py.test 进行单元测试时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24877025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com