gpt4 book ai didi

python-3.x - 使用 g 的 flask pytest 测试功能

转载 作者:行者123 更新时间:2023-12-04 14:01:10 24 4
gpt4 key购买 nike

我正在建立我的测试 Flask Cookiecutter ,我所有的其他测试工作正常。我只有在测试使用 g 的函数时才会遇到问题元素,例如 g.user在我的 views.py 文件中。

我的 conftest.py与flask-cookiecutter 加上来自the faking resources and context trick 的这个添加完全相同来自 flask 测试。

### 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 的函数元素。谢谢!

最佳答案

这个问题很老了,但与我遇到的问题最相关,我有一个简单的解决方案。
给定一个测试客户端的 fixture ,像这样(原谅轻微的伪代码):

@pytest.fixture()
def test_client():
app = create_app()
with app.test_client() as test_client:
with app.app_context():
yield test_client
我试着创建一个修改 g 的装置, def modify_g(test_client)认为依赖于 test_client 提供的上下文这将使它可用。由于我可能不完全了解 pytest 如何评估装置,情况并非如此。你得到同样的 '_AppCtxGlobals' object has no attribute错误。但是,如果您创建一个中间函数,它会正确评估,并且修改后的 g对象将出现在测试上下文中。
@pytest.fixture()
def pre_test_client():
app = create_app()
with app.test_client() as test_client:
with app.app_context():
yield test_client

@pytest.fixture()
def test_client(pre_test_client):
yield pre_test_client

@pytest.fixture()
def modify_g(pre_test_client):
g.user = 'test'
然后使用 g 的测试将起作用,如果定义:
def test_g_data(test_client, modify_g):
这意味着在 g 数据中模拟许多不同的状态并将它们作为 fixture 放入测试函数中非常容易。
我诚然不明白为什么这是必要的,所以我很感激任何关于 pytest 如何评估装置的说明。
请注意,这会忽略 appcontext_pushed Flask 提供的解决方案,但它是一种非常快速和简单的方法来使其工作,尽管可能不是最佳解决方案。

关于python-3.x - 使用 g 的 flask pytest 测试功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42964347/

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