如何在测试用例中使用数据库视图

0 投票
2 回答
1810 浏览
提问于 2025-04-17 14:42

我在测试案例中无法使用数据库视图。另一方面,我可以在前端功能中使用这些数据库视图。但是当我在测试案例中尝试从视图获取数据时,它返回的是空值。

请给我一些建议,如何在测试案例中使用数据库视图。

2 个回答

0

我猜你说的数据库视图是指在视图中访问数据库。

那么,我觉得你的问题是你没有一个测试用的数据库,而Django正在尝试对其进行测试。

解决这个问题的方法是使用叫做“fixtures”的东西。(你也可以用SQL来做,但觉得用fixtures更简单。)

最简单的方法是使用Django提供的 dumpdata 命令。

python manage.py dumpdata

这个命令会创建一个文件,文件会放在你的应用目录里,你可以在测试中像这样使用它:

例如

myDjangoProject/myCoreApp/fixtures/myCoreApp_views_testdata.json

注意:myCoreApp 这个名字可能不是这个。

你还可以在 settings.py 中设置一个 FIXTURES_DIR,这样可以告诉Django将来在哪里查找fixtures。

在测试中使用fixture时,你可以这样做:

class SomeViewThatIWantToTest(TestCase): #Note, you must use django.test.TestCase
    fixtures = ['core_views_testdata.json']

完成这些后,你应该能像平常一样在视图中访问你的数据。这可能需要一些调整以适应你的具体情况,所以我在下面添加了官方文档的链接!

祝你好运,如果我说错了,请纠正我! :)

在这里了解更多信息

4

你说的数据库视图,是不是指你在用一个不受管理的模型,这个模型代表了一个底层的数据库视图(具体描述可以参考这里)?

如果是这样的话,我发现,在单元测试的时候,Django会忽略模型元数据中的managed = False设置,反而会创建一个实际的表。除非你在setUp方法里明确填充这个表,否则它会是空的。

一个简单粗暴的解决办法是在你的测试用例的setUp方法里,明确删除这个表并创建视图,像这样:

# Imports
from django.db import connection
from django.core.files import File

...

        # Inside your test case setUp method
        # Drop the table
        cursor = connection.cursor()
        # See note 1
        cursor.execute("SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0; DROP TABLE IF EXISTS myproject_myview; SET SQL_NOTES=@OLD_SQL_NOTES;")
        cursor.close()

        # Create the view
        # See note 2
        file_handle=open('/full/path/to/myproject/sql/create_myview.sql','r+')
        sql_file=File(file_handle)
        sql = sql_file.read()
        cursor = connection.cursor()
        cursor.execute(sql) 
        cursor.close()

注意事项:

  1. 这个方法是为了绕过MySQL的问题,所以可能不适用于你的情况。这个表只会在第一次运行setUp时存在。如果你在后续运行中尝试删除这个表,MySQL会发出警告——这段代码会抑制这些警告。

  2. 这个文件包含了创建单个视图的代码,格式是CREATE OR REPLACE VIEW myproject_myview AS...。我发现,如果用同一个游标执行一个包含多个命令的文件,也会引发问题。

撰写回答