【问题标题】:Django unittest on_delete CASCADEDjango unittest on_delete CASCADE
【发布时间】:2020-06-14 00:30:19
【问题描述】:

我正在为 Django 应用程序编写测试。

目前,为了测试级联删除,我创建实例,删除父级并断言子级也被删除。

有没有更好的方法来做到这一点,例如使用_meta.get_field检索传递给模型的ForeignKey的参数?

【问题讨论】:

  • 可以用_meta.get_fields()获取字段列表,用instanceof(field, ForeignKey)过滤,查看field.on_delete。但我觉得你测试 Django 功能有点奇怪。这个想法是您测试您的业务逻辑。不是 Django 的,因为 Django 的开发人员需要确保它正常工作。
  • @WillemVanOnsem 谢谢。我正在对此进行测试,以防有人意外更改代码中的CASCADE,他们会在运行测试时收到警报。我是测试新手,是不是太过分了?
  • 不是本身。当然,你当然应该看看你会从中得到什么,可能的麻烦是什么,以及你付出了多少努力

标签: django unit-testing django-models django-testing django-tests


【解决方案1】:

您可以使用Model._meta.get_fields() 从模型中获取字段列表。那么对于每个字段,你可以用isinstance(field, ForeignKey)检查是否是一个ForeignKey(或者OneToOneField,这是一个ForeignKey的子类),然后获取属性field.on_delete来判断“父类”是什么" 如果它被删除,它将与 "child" 一起使用。

因此,例如,您可以通过以下方式获取 ForeignKey 设置为 CASCADE 的字段的名称:

[f.name
 for f in MyModel._meta.get_fields()
 if isinstance(f, ForeignKey) and f.remote_field.on_delete is models.CASCADE]

【讨论】:

    【解决方案2】:

    这是@Willem 的答案重写为详细失败的测试函数:

    def test_foreignkey_cascade(self):
        """
        Test all FKs have on_delete=models.CASCADE unless otherwise specified
        """
    
        for f in self.model_instance._meta.get_fields():
            if isinstance(f, models.ForeignKey):
                self.assertEquals(f.remote_field.on_delete, models.CASCADE,
                                  '{} failed, value was {}'.format(
                                      f.name, f.remote_field.on_delete))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-17
      • 2022-01-01
      • 1970-01-01
      • 2018-11-16
      • 2013-02-24
      • 1970-01-01
      • 2021-12-27
      • 2018-11-03
      相关资源
      最近更新 更多