在Pytest-Django中处理未管理模型

在Pytest-Django中处理未管理模型

💡 原文英文,约500词,阅读约需2分钟。
📝

内容提要

本文探讨了在Django项目中测试未管理模型的两种方法:一是临时将未管理模型标记为管理,简单但跳过迁移测试;二是手动创建未管理模型,确保迁移测试,但稍显复杂。同时,建议在可能的情况下避免使用transaction=True进行事务测试。

🎯

关键要点

  • 在Django项目中,未管理模型的测试具有挑战性,尤其是在混合使用管理和未管理模型时。
  • 第一种方法是临时将未管理模型标记为管理,简单但会跳过迁移测试。
  • 第二种方法是手动创建未管理模型,确保迁移测试,但稍显复杂。
  • 使用transaction=True进行事务测试时,未管理模型需要特殊处理,因为该选项只会截断管理模型。
  • 可以通过在测试运行期间将未管理模型标记为管理来确保它们被包含在截断中。
  • 在涉及on_commit钩子的场景中,可以通过直接捕获和执行on_commit回调来避免使用transaction=True。

延伸问答

在Django项目中,未管理模型的测试有哪些挑战?

未管理模型的测试挑战主要在于它们与管理模型混合使用时,可能导致测试设置复杂,尤其是在涉及多个数据库时。

如何临时将未管理模型标记为管理以进行测试?

可以在conftest.py中使用pytest钩子,将未管理模型的_meta.managed属性设置为True,并在pytest设置中添加--no-migrations选项。

手动创建未管理模型的优缺点是什么?

优点是可以确保迁移测试,缺点是实现起来稍显复杂,并且不适用于transaction=True的事务测试。

在使用transaction=True进行测试时,未管理模型需要怎样处理?

未管理模型需要特殊处理,因为transaction=True只会截断管理模型,因此可以在测试运行期间将未管理模型标记为管理。

如何避免在涉及on_commit钩子的场景中使用transaction=True?

可以通过直接捕获和执行on_commit回调,使用pytest-django的django_capture_on_commit_callbacks来避免使用transaction=True。

pytest-django中django_db和django_db(transaction=True)有什么区别?

django_db会在测试结束时回滚更改,而django_db(transaction=True)会提交更改并在每个测试后截断数据库表。

➡️

继续阅读