使用 pytest 进行测试时,石墨烯查询无限期挂起

Posted

技术标签:

【中文标题】使用 pytest 进行测试时,石墨烯查询无限期挂起【英文标题】:Graphene query hangs indefinitely when testing with pytest 【发布时间】:2019-11-13 13:31:22 【问题描述】:

我正在尝试测试我的后端,用 Django 2.2.2 和 Python 3 编写。我创建了一些 graphql 查询,这些查询在使用 graphql Web 界面进行测试时肯定可以工作。然而,当使用 pytest 和石墨烯测试客户端进行测试时,这些查询总是会无限期挂起。我整理了一个可重现的示例,该示例实际上基于 graphene-django documentation 中的代码示例。

test_example.py:

import pytest
import graphene
from graphene_django import DjangoObjectType
from graphene.test import Client
from django.db import models

class UserModel(models.Model):
    name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100)

class User(DjangoObjectType):
    class Meta:
        model = UserModel

class Query(graphene.ObjectType):
    users = graphene.List(User)

    def resolve_users(self, info):
        return UserModel.objects.all()


schema = graphene.Schema(query=Query)
client = Client(schema)


def test_user():
    query = '''
    query 
      users 
        name,
        lastName
      
    
    '''
    result = client.execute(query)
    assert 0 # dummy assert

此示例的行为方式相同(永远停止,没有错误)。我正在使用最新的 graphene-django (2.3.2) 和 pytest (4.6.3)。我可能还应该提到我在 Docker 容器中运行它。任何想法为什么会发生这种情况?这是 graphene-django 库中的错误吗?

【问题讨论】:

【参考方案1】:

在翻阅文档一段时间后,我自己找到了答案。 Pytest 需要使用数据库的权限。因此,只需在测试前添加 pytest 标记@pytest.mark.django_db 即可解决问题。作为替代方案,可以使用pytestmark = pytest.mark.django_db 将整个模块标记为允许数据库访问。见pytest-django docs。

文档说如果不授予数据库访问权限,测试将失败,所以我不希望它们永远停止。

【讨论】:

以上是关于使用 pytest 进行测试时,石墨烯查询无限期挂起的主要内容,如果未能解决你的问题,请参考以下文章

石墨烯代码在 Django 数据迁移之前运行

如何在石墨烯烧瓶中进行多个查询过滤器?

Django 石墨烯中继限制对用户拥有的对象的查询

聚合石墨烯/django 查询中的字段

“必须提供查询字符串。”石墨烯-蟒蛇

如何在石墨烯中将函数作为查询结果返回?