如何在测试用例中使用数据库视图
我在测试案例中无法使用数据库视图。另一方面,我可以在前端功能中使用这些数据库视图。但是当我在测试案例中尝试从视图获取数据时,它返回的是空值。
请给我一些建议,如何在测试案例中使用数据库视图。
2 个回答
我猜你说的数据库视图是指在视图中访问数据库。
那么,我觉得你的问题是你没有一个测试用的数据库,而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']
完成这些后,你应该能像平常一样在视图中访问你的数据。这可能需要一些调整以适应你的具体情况,所以我在下面添加了官方文档的链接!
祝你好运,如果我说错了,请纠正我! :)
你说的数据库视图,是不是指你在用一个不受管理的模型,这个模型代表了一个底层的数据库视图(具体描述可以参考这里)?
如果是这样的话,我发现,在单元测试的时候,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()
注意事项:
这个方法是为了绕过MySQL的问题,所以可能不适用于你的情况。这个表只会在第一次运行
setUp
时存在。如果你在后续运行中尝试删除这个表,MySQL会发出警告——这段代码会抑制这些警告。这个文件包含了创建单个视图的代码,格式是
CREATE OR REPLACE VIEW myproject_myview AS...
。我发现,如果用同一个游标执行一个包含多个命令的文件,也会引发问题。