TestCase
和TransactionTestCase
之间的主要区别是,TestCase
封装测试与atomic()
块所有的时间。从documentation:
裹在两个嵌套的原子()块的测试:一个是整个班级,一个用于每个测试
现在,假设你有一个应该提高,如果一个错误的方法它不包裹在atomic()
区块内。您正试图为此编写测试:
def test_your_method_raises_error_without_atomic_block(self):
with self.assertRaises(SomeError):
your_method()
此测试意外失败!原因是,你猜对了,TestCase
用atomic()
把所有的时间都封存在测试中。因此,your_method()
不会引发错误,这就是测试失败的原因。在这种情况下,您应该使用TransactionTestCase来通过测试。
select_for_update()就是一个明显的例子:
上支持SELECT ... FOR UPDATE后端评估与select_for_update()在自动提交模式下的queryset是TransactionManagementError错误
从TransactionTestCase documentation:
带有TestCase类,您不能测试代码块是否在一个transactio内执行N,如使用select_for_update()
时必需的,如果我们看一看的select_for_update()
的文档,我们看到了一个警告:
虽然select_for_update()在自动提交模式下正常失败,因为TestCase会自动将每个测试包装在一个事务中,即使在一个atomic()块之外的TestCase中调用select_for_update()方法也会(可能意外地)传递,而不会引发TransactionManagementError。要正确测试select_for_update(),你应该使用TransactionTestCase。
希望它有帮助!
是的,它的帮助! ,我有很多疑问。显然我无法理解交易。如果你不介意,你会给我你的联系方式,以便进行完美的聊天。因为我不能在这里聊天 –
对不起,我没有在您的个人资料中找到任何关于联系人的信息。这就是我在这里问的原因。请考虑我 –
@vishnumc给我发电子邮件[email protected] –