Django测试中的assertRaises未能识别到抛出的异常是预期的

3 投票
1 回答
3110 浏览
提问于 2025-04-17 02:03

我有以下的测试代码片段:

with self.assertRaises(models.NotEnoughInventorySpace):
    self.inv2.add_item(self.item2, 1)

这个测试失败了:

Creating test database for alias 'default'...
E.
======================================================================
ERROR: test_limited_inventory (wotw_project.game.tests.TestInventory)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "D:\...\wotw\wotw_project\..\wotw_project\game\tests.py", line 34, in test_limited_inventory
    self.inv2.add_item(self.item2, 1)
  File "D:\...\wotw\wotw_project\..\wotw_project\game\models.py", line 460, in add_item
    raise NotEnoughInventorySpace(self)
NotEnoughInventorySpace: There is not enough space in the inventory 'Inventory: 2'

----------------------------------------------------------------------
Ran 2 tests in 0.015s

FAILED (errors=1)
Destroying test database for alias 'default'...
Finished "D:\...\wotw\wotw_project\manage.py test game" execution.

我不明白为什么抛出的异常和我传给 assertRaises 的不一样。

我用 manage.py test game 来运行代码,这个命令会使用在 wotw_project.game 目录下,和我的 models.py 文件在一起的 tests.py 文件。

我对这个问题的研究显示,可能是导入的文件有问题(也就是说, 文件和导入的文件不一样)。不过我用的是标准的方法来运行单元测试,所以我不明白为什么只有我会遇到这个问题,肯定还有其他人也在 Django 中使用过 assertRaises!

1 个回答

-1

问题不在于 assertRaises,而是你的异常类在产品代码和测试代码中的导入方式不一样。

仔细检查一下你的导入语句。确保在这两种情况下,导入的名字来自同一个模块。在Django项目中,常常会出现同一个模块可以通过不同的名字导入的情况,比如因为这个目录可以通过Python路径中的两个入口访问。

撰写回答