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,正如我链接的答案中所说的,这是不可靠的。可能是由于该错误导致的,或者回滚失败。我当然建议升级。:)