我正在使用Flask Cookiecutter构建我的测试,所有其他测试都正常工作。只有当我测试一个使用
我的
当我在
我已经搜索过了,大多数例子使用Unittest或将所有pytest测试放在一个文件中。 我想坚持采用具有多个测试文件的模式,每个文件都利用
g
元素的函数时,例如在我的views.py文件中的g.user
,才会出现问题。我的
conftest.py
与flask-cookiecutter完全相同,另外还添加了来自Flask-Testing的伪造资源和上下文技巧。### conftest.py ###
...
from contextlib import contextmanager
from flask import appcontext_pushed, g
@contextmanager
def user_set(app, user):
def handler(sender, **kwargs):
g.user = user
with appcontext_pushed.connected_to(handler, app):
yield
...
这是我的测试文件:
### test_file.py ###
from .conftest import user_set
import pytest
from my_app.utils import presave_posted_settings # <-- fn I want to test
@pytest.fixture()
def form_data():
return {...bunch of data..}
@pytest.mark.usefixtures("form_data")
class TestPresaveSettings:
"""Test cases for checking attributes before saving"""
def test_presave_posted_settings(self, form_data, user, testapp):
"""User meals are selected in form"""
with user_set(testapp, user): #<-- testapp and user available from flask-cookiecutter conftest.py
assert presave_posted_settings(form_data)
当我在
test_file.py
上运行测试时,我看到:user = <User 'user0'>, testapp = <webtest.app.TestApp object at 0x1101ee160>
def test_presave_posted_settings(self, form_data, user, testapp):
"""User meals are selected in form"""
with user_set(testapp, user):
> assert presave_posted_settings(form_data)
test_utils.py:20:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../my_app/utils.py:26: in presave_posted_settings
g.user.breakfast = g.user.lunch = g.user.dinner = g.user.snack = g.user.dessert = False
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <flask.g of 'my_app'>, name = 'user'
def __getattr__(self, name):
if name == '__members__':
return dir(self._get_current_object())
> return getattr(self._get_current_object(), name)
E AttributeError: '_AppCtxGlobals' object has no attribute 'user'
我已经搜索过了,大多数例子使用Unittest或将所有pytest测试放在一个文件中。 我想坚持采用具有多个测试文件的模式,每个文件都利用
conftest.py
,但我无论如何都无法弄清楚如何设置它,以便我可以测试使用g
元素的函数。谢谢!