0

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

请给我建议在测试用例中使用数据库视图

4

2 回答 2

2

数据库视图是指您使用的是代表底层数据库视图的非托管模型(如此所述)?

如果是这样,我发现在单元测试期间,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()

笔记:

  1. 这是为了解决 MySQL 问题,因此可能不适用于您的情况。该表只会在第一次setUp运行时存在。如果您尝试在后续传递中删除表,MySQL 将生成警告 - 此代码会抑制它们。

  2. 此文件包含格式为单个视图的创建代码CREATE OR REPLACE VIEW myproject_myview AS...。我发现尝试使用相同的光标执行包含多个命令的文件也会导致问题。

于 2013-02-11T20:08:59.287 回答
0

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

话虽如此,我认为您的问题是您没有 Django 尝试测试的测试数据库。

这就是您开始使用它及其所谓的固定装置的方式。(您也可以使用 SQL 来执行此操作,但认为使用固定装置更容易)。

最简单的是使用dumpdataDjango 提供的命令。

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']

在此之后,您应该能够正常访问视图中的数据。这可能需要一些调整以适合您的确切示例,因此我在底部添加了官方文档的链接!

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

在此处阅读有关此的更多信息

于 2013-02-11T08:03:52.337 回答