django - 如何让 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?
解决方案
请参阅@dirkgroten 的答案,了解如何解决单元测试问题。
关于如何更有效地消除不良 ID 的后续问题,一种方法如下:
good_ids = Foo.objects.filter(id__in=an_id_array_with_some_invalid_ids).values_list('id', flat=True)
推荐阅读
- firebase - 我正在尝试使用 firstore 和 swiftui 编写一些测试,我可以创建和读取,但现在我不知道如何列出唯一数据,
- html - 为什么字体真棒在这个html代码中不起作用?
- java - 我正在尝试在 android studio 中使用 MQTT 协议。我也更新了 gradle.properties
- performance - 初始渲染时如何增加 Ionic4 项目的加载时间?
- javascript - 为什么 Stripe Element 不能在 iphone 上运行,但在 Android 和桌面上运行良好?
- php - 如何在刀片内部弹出模态表单
- excel - 查找并突出显示系列/列 VBA 中的最后一个数据点
- ckeditor - 将图像数据从 CKEditor 5 上传到 Firebase 存储会创建格式错误的图像
- swift - 为什么我使用 UNUserNotificationCenter 创建的本地通知未显示在屏幕右上角?
- java - 联合实际和预期相同,但测试失败