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

时间:2013-02-04 13:06:52

标签: python django

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

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

2 个答案:

答案 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()

注意:

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

  2. 此文件包含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']

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

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

Read more about this here