【问题标题】:Django GraphQL Test: How to test addition of new model fields?Django GraphQL 测试:如何测试新模型字段的添加?
【发布时间】:2021-01-10 00:18:09
【问题描述】:

我有一个简单的模型,

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 查询也将有助于验证从架构返回的数据。

【问题讨论】:

    标签: python django graphql python-unittest graphene-django


    【解决方案1】:

    如果需要监控django模型变化,django已经有这样一个功能:https://docs.djangoproject.com/en/3.1/ref/django-admin/#cmdoption-makemigrations-check

    无论何时进行验证(已检查)模型更改,都应使用makemigrations 命令将它们作为迁移脚本持久化。然后django-admin makemigrations --check 将这些迁移脚本用作参考点来检查模型突变(即添加/更改/删除的字段)。

    【讨论】:

    【解决方案2】:

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

    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)

    参考

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 1970-01-01
      • 2021-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      相关资源
      最近更新 更多