Py学习  »  Django

如何使django单元测试检查m2m db约束?

Troy • 6 年前 • 2009 次点击  

假设我有这个模型定义:

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 . 但是,如果我从 django.test.TestCase ,最后一行不会抛出错误。而是等到 _post_teardown() 抛出 积分误差 .

下面是一个小项目来说明这个问题: https://github.com/t-evans/m2mtest

我该怎么解决?我想这是可以配置的,但我还没找到…

后续问题:

最后,当有坏的ID传递给 m2m_field.set() 方法(我需要单元测试来验证错误的id是否被正确处理,这就是为什么延迟 积分误差 在单元测试中不起作用)。

我知道我可以通过在数组上循环并为每个id点击一个db来找到坏id。 set() 方法忽略/删除错误的ID?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39728
文章 [ 2 ]  |  最新文章 6 年前
Troy
Reply   •   1 楼
Troy    7 年前

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

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

good_ids = Foo.objects.filter(id__in=an_id_array_with_some_invalid_ids).values_list('id', flat=True)
dirkgroten
Reply   •   2 楼
dirkgroten    7 年前

TestCase 附加包装测试 atomic() 块,与 TransactionTestCase ,因此要测试特定的数据库事务行为,应使用 事务测试用例 .

我相信 IntegrityError 只在提交事务时抛出,因为此时数据库将发现 id S.

通常,如果要测试测试期间引发的数据库异常,应使用 事务测试用例 并使用以下方法测试代码:

with self.assertRaises(IntegrityError):
     # do something that gets committed to db