2017-06-09 104 views
2

您可以请任何人解释TestCase类和TransactionTestCase类之间的区别。我已阅读文档,但它只说TestCase在数据库事务中运行测试,并使用回滚'撤消'数据库中的测试,并且如果您需要在测试中手动管理事务,则需要使用django.test.TransactionTestCase 。django测试中的TestCase和TransactionTestCase类之间的区别

请你帮我理解一个例子的实际区别吗? 我只想知道TestCase在什么情况下失败?还有回滚是自动发生的还是我们必须写回滚语句?

请帮我

回答

2

TestCaseTransactionTestCase之间的主要区别是,TestCase封装测试与atomic()块所有的时间。从documentation

裹在两个嵌套的原子()块的测试:一个是整个班级,一个用于每个测试

现在,假设你有一个应该提高,如果一个错误的方法它不包裹在atomic()区块内。您正试图为此编写测试:

def test_your_method_raises_error_without_atomic_block(self): 
    with self.assertRaises(SomeError): 
     your_method() 

此测试意外失败!原因是,你猜对了,TestCaseatomic()把所有的时间都封存在测试中。因此,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。

希望它有帮助!

+0

是的,它的帮助! ,我有很多疑问。显然我无法理解交易。如果你不介意,你会给我你的联系方式,以便进行完美的聊天。因为我不能在这里聊天 –

+0

对不起,我没有在您的个人资料中找到任何关于联系人的信息。这就是我在这里问的原因。请考虑我 –

+0

@vishnumc给我发电子邮件[email protected] –

相关问题