Python Django测试成功后提交

Python Django测试成功后提交,python,django,django-database,django-unittest,Python,Django,Django Database,Django Unittest,我在@transaction.commit\u on\u success中包装了一个函数,并对其运行Django单元测试 函数太长,无法粘贴,但某些伪代码为: @transaction.commit_on_success def func(): order = Order.create() order.save() OrderItem.create(order=order) test = 10/0 # make sure we run into an error 然后在单元测试

我在
@transaction.commit\u on\u success
中包装了一个函数,并对其运行Django单元测试

函数太长,无法粘贴,但某些伪代码为:

@transaction.commit_on_success
def func():
  order = Order.create()
  order.save()
  OrderItem.create(order=order)
  test = 10/0 # make sure we run into an error
然后在单元测试中,我检查
len(Order.objects.all())==0

我的函数返回一个有效的订单对象,因此事务正在提交。

我做错了什么


编辑:我使用的是Django 1.5,如果您使用的是MySQL,那么您的表可能不支持事务。有关详细信息,请参阅上的Django文档

您应该使用
@transaction.atomic
取而代之的是,自django 1.6以来,commit_on_success一直被贬低,因为它不可靠

有关更多信息,请查看以下答案:

编辑(因为您使用的是1.5):

一种可能的解决方法是使用
@transaction.commit\u手动提交
,如下所示:

解决了这个问题

我需要使用(1.5没有文档)

TransactionTestCase可以调用commit和rollback,并观察这些调用对数据库的影响

我以前遇到过这个问题,但尝试将其与TestCase结合使用。它们是互斥的,您的单元测试只能使用其中一种。因为我们使用的是一个定制的测试类,所以我不得不进行一些手动操作,但现在一切都正常地回滚了

Django 1.8测试用例现在似乎也支持事务测试:

在Django的旧版本中,无法在TestCase中测试事务提交和回滚的效果。随着Django 1.8中旧式事务管理的弃用周期的结束,事务管理命令(例如transaction.commit())在TestCase中不再被禁用


感谢John和siracoj的回答。无论如何,我最好从1.5升级;)

我用的是博士后,已经查过文件了。谢谢你!我们的堆栈使用1.5。虽然我可以考虑升级Django,但我还是想弄清楚我们当前版本中发生了什么。谢谢你的编辑。我想我会继续这个策略。所以我假设这只是一个提交成功的bug?@grokpot Yea,正如我链接的答案中所说的,这是不可靠的。可能是由于该错误导致的,或者回滚失败。我当然建议升级。:)