Django GraphQL 测试: 如何测试添加新的模型字段?

12 浏览
0 Comments

Django GraphQL 测试: 如何测试添加新的模型字段?

我有一个简单的模型,如下:

class Person(models.Model):
    first_name = models.CharField(max_length=20)

我已经设置好GraphQL来查询数据,如下:

import graphene
import graphene_django
from .models import Person
class PersonType(graphene_django.DjangoObjectType):
    class Meta:
        model = Person
        fields = '__all__'
class PersonQuery(graphene.ObjectType):
    persons = graphene.List(PersonType)
    def resolve_persons(*args, **kwargs):
        return Person.objects.all()

到目前为止,一切都很好。后来我决定为查询persons数据编写单元测试,如下:

from django.test import TestCase
from .models import Person
from .schema import schema
class TestGraphQLQuery(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.person = Person.objects.create(first_name="Jack")
    def test_person_query(self):
        query = """
            query{
              persons {
                id
                firstName
              }
            }
        """
        result = schema.execute(query).data
        expected = {'persons': [{'id': f'{self.person.pk}', 'firstName': self.person.first_name}]}
        self.assertEqual(result, expected)

这也是有效的。后来,我的模型用一个额外字段age进行了更新,如下:

class Person(models.Model):
    first_name = models.CharField(max_length=20)
    age = models.IntegerField(default=0)

更改后,我运行了单元测试。如我所料,它通过了。

问题

我如何创建测试用例,使得添加或删除任何字段都会导致测试失败?

我正在寻求的这些测试用例的优点

  1. 我们会在模型中添加新字段时被通知到
  2. 我们会在删除或重命名字段时被通知到
  3. 生成动态GraphQL查询也有助于验证模式返回的数据。
admin 更改状态以发布 2023年5月23日
0
0 Comments

我们可以使用内省查询来获取特定类型的字段。

from django.test import TestCase
from .models import Person
from .schema import schema
class TestGraphQLQuery(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.person = Person.objects.create(first_name="Jack")
    def test_person_query(self):
        introspection_query = """
            {
               __type(name:"PersonType") {
                  fields {
                     name
                  }  
               }
            }
        """
        introspection_result = schema.execute(introspection_query).data["__type"]["fields"]
        introspection_expected = [{'name': 'id'}, {'name': 'firstName'}, {'name': 'age'}]
        self.assertCountEqual(introspection_result, introspection_expected)
        dynamic_person_fields = "\n".join([item['name'] for item in introspection_result])
        data_query = f"""
            query{{
              persons {{
                {dynamic_person_fields}
              }}
            }}
        """
        data_result = schema.execute(data_query).data["persons"]
        data_expected = [{'id': f'{self.person.pk}', 'firstName': self.person.first_name, 'age': self.person.age}]
        self.assertEqual(data_result, data_expected)

参考

0
0 Comments

如果需要监视Django模型的更改,Django已经有这样的功能:https://docs.djangoproject.com/en/3.1/ref/django-admin/#cmdoption-makemigrations-check

每当已经验证(已检查)的模型更改被进行时,它们应该使用 makemigrations 命令作为迁移脚本持久化。这些迁移脚本随后被用作参考点由django-admin makemigrations --check检查模型发生突变(即添加/更改/删除字段)。

0