首页 > 解决方案 > 如何让 Django 单元测试检查 M2M DB 约束?

问题描述

假设我有这个模型定义:

class Foo(Model):
   ...

class Bar(Model):
   some_m2m_field = ManyToManyField(Foo)

这个代码:

bar = Bar.objects.create()
bar.some_m2m_field.set(an_id_array_with_some_invalid_pks)

当我正常运行它时,最后一行应该会抛出一个IntegrityError. 但是,如果我从 a 运行相同的代码django.test.TestCase,最后一行不会引发错误。相反,它将等到_post_teardown()测试阶段抛出IntegrityError.

这是一个演示该问题的小项目:https ://github.com/t-evans/m2mtest

我该如何解决?我想这是可配置的,但我一直无法找到它......

后续问题:

最终,我需要处理将错误 ID 传递给m2m_field.set()方法的情况(并且我需要单元测试来验证错误 ID 是否被正确处理,这就是IntegrityError单元测试中的延迟不起作用的原因)。

我知道我可以通过遍历数组并为每个 ID 击中 DB 来找到错误的 ID。是否有更有效的方法来查找错误 ID 或(更好)简单地告诉set()方法忽略/删除错误 ID?

标签: djangodjango-models

解决方案


请参阅@dirkgroten 的答案,了解如何解决单元测试问题。

关于如何更有效地消除不良 ID 的后续问题,一种方法如下:

good_ids = Foo.objects.filter(id__in=an_id_array_with_some_invalid_ids).values_list('id', flat=True)

推荐阅读