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