【问题标题】:Testing manual transactions inside Django unittests在 Django 单元测试中测试手动事务
【发布时间】:2018-07-04 01:34:04
【问题描述】:

如何在 Django 单元测试中测试禁用 autocommit 并使用保存点的代码?

默认的 Django unittest 类将所有测试包装在 @atomic 装饰器中,这通常正是您想要的,以确保 sqlite 数据库在测试之间被重置。但是,任何在测试中触及transaction.set_autocommit() 的代码都会引发错误:

TransactionManagementError: This is forbidden when an 'atomic' block is active.

即使它在单元测试之外也能正常工作。

如何在单元测试中临时禁用事务自动提交,以便测试手动提交?

【问题讨论】:

  • 我不完全确定这在测试中是否有效,但请尝试在测试函数中添加 @transaction.commit_on_success 装饰器
  • @SimasJoneliunas 该装饰器在几个版本前已被删除,我无法使用。

标签: python django django-unittest


【解决方案1】:

使用TransactionTestCase:

TransactionTestCase 和 TestCase 是相同的,除了将数据库重置为已知状态的方式以及测试代码测试提交和回滚效果的能力:TransactionTestCase 在通过截断所有表来运行测试。 TransactionTestCase 可以调用 commit 和 rollback 并观察这些调用对数据库的影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多