栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

TransactionManagementError“在使用信号时,只能在单元测试期间执行查询,直到‘atomic’块结束”

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

TransactionManagementError“在使用信号时,只能在单元测试期间执行查询,直到‘atomic’块结束”

我本人也遇到了同样的问题。这是由于在新版本的Django中如何处理事务的古怪之处,加上故意触发异常的单元测试。

我有一个单元测试,通过有意触发IntegrityError异常来检查以确保实施了唯一的列约束:

def test_constraint(self):    try:        # Duplicates should be prevented.        models.Question.objects.create(domain=self.domain, slug='barks')        self.fail('Duplicate question allowed.')    except IntegrityError:        pass    do_more_model_stuff()

在Django 1.4中,这可以正常工作。但是,在Django 1.5 / 1.6中,每个测试都包装在一个事务中,因此,如果发生异常,它将破坏该事务,直到你明确地将其回滚为止。因此,该事务中任何进一步的ORM操作(例如

my do_more_model_stuff()
)都将因该
django.db.transaction.TransactionManagementError
异常而失败。

就像注释中提到的caio一样,解决方案是使用以下方式捕获你的异常

transaction.atomic:

from django.db import transactiondef test_constraint(self):    try:        # Duplicates should be prevented.        with transaction.atomic(): models.Question.objects.create(domain=self.domain, slug='barks')        self.fail('Duplicate question allowed.')    except IntegrityError:        pass

这样可以防止故意抛出的异常破坏整个单元测试的事务。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/391521.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号