Unit testing 如何在graphene_django或graphql_jwt中测试GraphQLError异常?
我正在使用graphene_django和graphql_jwt在django中实现用户类型和身份验证。以下是我的两个文件:代码和相应的测试位于名为“users”的文件夹中,该文件夹是应用程序级文件夹(但不是django应用程序) schema.pyUnit testing 如何在graphene_django或graphql_jwt中测试GraphQLError异常?,unit-testing,graphql,graphene-python,graphene-django,django-graphql-jwt,Unit Testing,Graphql,Graphene Python,Graphene Django,Django Graphql Jwt,我正在使用graphene_django和graphql_jwt在django中实现用户类型和身份验证。以下是我的两个文件:代码和相应的测试位于名为“users”的文件夹中,该文件夹是应用程序级文件夹(但不是django应用程序) schema.py import graphene from graphene_django import DjangoObjectType from django.contrib.auth import get_user_model class UserType(
import graphene
from graphene_django import DjangoObjectType
from django.contrib.auth import get_user_model
class UserType(DjangoObjectType):
class Meta:
model = get_user_model()
class Query(graphene.ObjectType):
user = graphene.Field(UserType, id=graphene.Int(required=True))
me = graphene.Field(UserType)
def resolve_user(self, info, id):
user = get_user_model().objects.get(id=id)
return user
def resolve_me(self, info):
current_user = info.context.user
if current_user.is_anonymous:
raise GraphQLError("Not logged in !")
return current_user
from django.contrib.auth import get_user_model
from graphql import GraphQLError
from graphql.error.located_error import GraphQLLocatedError
from graphql_jwt.testcases import JSONWebTokenTestCase
class TestUserAuthentication(JSONWebTokenTestCase):
def setUp(self):
self.user = get_user_model().objects.create(
username='Moctar', password='moctar')
# @unittest.skip("Cannot handle raised GraphQLError")
def test_not_autenticated_me(self):
query = '''
{
me{
id
username
password
}
}
'''
with self.assertRaises(GraphQLError, msg='Not logged in !'):
self.client.execute(query)
def test_autenticated_me(self):
self.client.authenticate(self.user)
query = '''
{
me{
id
username
password
}
}
'''
self.client.execute(query)
测试.py
import graphene
from graphene_django import DjangoObjectType
from django.contrib.auth import get_user_model
class UserType(DjangoObjectType):
class Meta:
model = get_user_model()
class Query(graphene.ObjectType):
user = graphene.Field(UserType, id=graphene.Int(required=True))
me = graphene.Field(UserType)
def resolve_user(self, info, id):
user = get_user_model().objects.get(id=id)
return user
def resolve_me(self, info):
current_user = info.context.user
if current_user.is_anonymous:
raise GraphQLError("Not logged in !")
return current_user
from django.contrib.auth import get_user_model
from graphql import GraphQLError
from graphql.error.located_error import GraphQLLocatedError
from graphql_jwt.testcases import JSONWebTokenTestCase
class TestUserAuthentication(JSONWebTokenTestCase):
def setUp(self):
self.user = get_user_model().objects.create(
username='Moctar', password='moctar')
# @unittest.skip("Cannot handle raised GraphQLError")
def test_not_autenticated_me(self):
query = '''
{
me{
id
username
password
}
}
'''
with self.assertRaises(GraphQLError, msg='Not logged in !'):
self.client.execute(query)
def test_autenticated_me(self):
self.client.authenticate(self.user)
query = '''
{
me{
id
username
password
}
}
'''
self.client.execute(query)
然后,当我通过python manage.py测试用户运行测试时,它会说:
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
..F.
======================================================================
FAIL: test_not_autenticated_me (tests.TestUserAuthentication)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/my_username/my_projects/server/arjangen/app/users/tests.py", line 97, in test_not_autenticated_me
self.client.execute(query)
AssertionError: GraphQLError not raised : Not logged in !
----------------------------------------------------------------------
Ran 4 tests in 0.531s
FAILED (failures=1)
Destroying test database for alias 'default'...
我找过像这样的人
[引发异常但assertRaises未捕获
][1]
[1] :但这仍然不能解决我的问题。那么如何测试GraphQLError呢?试着在test\u not\u autenticated\u me()上删除这一行:
因为authenticate()
所做的是登录并获取JWT令牌。
如果您不登录,默认用户将是匿名用户对象。实际上,这一行是问题中的一个错误。正是通过删除该行,我的错误才会出现在上面。谢谢你指出了错误!