Django GraphQL 测试: 如何测试添加新的模型字段?
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)
更改后,我运行了单元测试。如我所料,它通过了。
问题
我如何创建测试用例,使得添加或删除任何字段都会导致测试失败?
我正在寻求的这些测试用例的优点
- 我们会在模型中添加新字段时被通知到
- 我们会在删除或重命名字段时被通知到
- 生成动态GraphQL查询也有助于验证模式返回的数据。
admin 更改状态以发布 2023年5月23日
我们可以使用内省查询来获取特定类型的字段。
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)
参考
如果需要监视Django模型的更改,Django已经有这样的功能:https://docs.djangoproject.com/en/3.1/ref/django-admin/#cmdoption-makemigrations-check
每当已经验证(已检查)的模型更改被进行时,它们应该使用 makemigrations 命令作为迁移脚本持久化。这些迁移脚本随后被用作参考点由django-admin makemigrations --check
检查模型发生突变(即添加/更改/删除字段)。