您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

TransactionManagementError“在使用信号时,您只能在'atomic'块的末尾才能执行查询”,但仅限于单元测试期间

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操作(例如mydo_more_model_stuff())都将因该django.db.transaction.TransactionManagementError异常而失败。

就像评论中提到的caio一样,解决方案是使用transaction.atomic如下方式捕获您的异常:

from django.db import transaction
def 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

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

其他 2022/1/1 18:28:45 有562人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶