我无法在测试用例中使用数据库视图。另一方面,我可以在前端功能中使用那些数据库视图。但是当我尝试从它的视图中获取数据时,在测试用例中返回 null。
请给我建议在测试用例中使用数据库视图
数据库视图是指您使用的是代表底层数据库视图的非托管模型(如此处所述)?
如果是这样,我发现在单元测试期间,Django 会忽略managed = False
模型元中的设置并创建一个实际的表。除非你在你的 this 中明确地填充它,否则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...
。我发现尝试使用相同的光标执行包含多个命令的文件也会导致问题。
我猜数据库视图是指在视图中访问数据库。
话虽如此,我认为您的问题是您没有 Django 尝试测试的测试数据库。
这就是您开始使用它及其所谓的固定装置的方式。(您也可以使用 SQL 来执行此操作,但我认为使用固定装置更容易)。
最简单的是使用dumpdata
Django 提供的命令。
python manage.py dumpdata
这将创建一个文件,该文件将位于您的应用程序目录中,您可以在测试中使用它,如下所示:
例如
myDjangoProject/myCoreApp/fixtures/myCoreApp_views_testdata.json
注意:myCoreApp
不会被命名为这个。
您还可以FIXTURES_DIR
在 as 中设置一个设置,settings.py
告诉 Django 将来在哪里寻找固定装置。
要在测试中使用固定装置,请执行以下操作
class SomeViewThatIWantToTest(TestCase): #Note, you must use django.test.TestCase
fixtures = ['core_views_testdata.json']
在此之后,您应该能够正常访问视图中的数据。这可能需要一些调整以适合您的确切示例,因此我在底部添加了官方文档的链接!
祝你好运,如果我错了,请纠正我!:)