gpt4 book ai didi

django - 在同一个 Django unittest 测试用例中测试多个 IntegrityErrors

转载 作者:行者123 更新时间:2023-11-28 19:42:07 24 4
gpt4 key购买 nike

我正在尝试运行以下 Django 单元测试:

class MyModelTests(TestCase):
def test_failed_duplicate(self):
m = MyModel.objects.create(a='a', b='a')
with self.assertRaises(IntegrityError):
MyModel.objects.create(a='a', b='b')
with self.assertRaises(IntegrityError):
MyModel.objects.create(a='a', b='c')
with self.assertRaises(IntegrityError):
MyModel.objects.create(a='a', b='d')

由于违反了字段a 上的唯一性约束,有几个测试都应该失败。 (我稍微混淆了断言,但它们都测试了应该失败的 a 的不同值。)

但是,在运行时我得到:

Traceback (most recent call last):
File "...", line 21, in test_failed_duplicate
MyModel.objects.create(a='a', b='c')
TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block.

我错过了什么?

最佳答案

你看到这个的原因是:

  1. 出于性能原因,TestCase 测试在事务内运行。
  2. IntegrityError 的引发将破坏当前事务(更准确地说,当前原子 block ),无论它是否被捕获。

因此,在您的代码中,第一个 assertRaises 正常工作,但由于引发了 IntegrityError,事务被破坏了。当您尝试使用下一个 create() 访问数据库时,您会收到 TransactionManagementError。参见 this ticket获取更多信息。

有两种可能的解决方案:

  1. 继承自 TransactionTestCase 而不是 TestCase。这使用表截断而不是事务来重置数据库,因此您不会遇到此问题。
  2. 在新的原子 block 中运行每个 create() 测试。您可以在工单中查看示例,并在 the docs 中查看更广泛的描述.

关于django - 在同一个 Django unittest 测试用例中测试多个 IntegrityErrors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24588520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com