如何使用自定义SQL视图扩展Django的测试数据库?

时间:2019-08-25 10:37:26

标签: django python-3.x unit-testing

我正在将Django 2.1与MySQL配合使用。 我有一个自定义SQL视图,该视图与Meta managed = False的模型绑定。 Django的TestCase不知道如何创建视图,因此我想提供SQL命令来创建该视图。最好的选择是在数据库创建时执行此操作,但是我不知道如何执行此操作。

到目前为止,我所做的是重写TestCase的{​​{1}}方法。看起来像这样:

setUp

我从类似的帖子How to use database view in test cases中获得了此解决方案。这将是一个不错的临时解决方案,但是问题在于所有这两个测试用例都处于活动状态,我得到以下错误:

class TaskDoneViewTest(TestCase):

    def setUp(self):
        """
        Create custom SQL view
        """
        cursor = connection.cursor()
        file_handle = open('app/tests/create_sql_view.sql', 'r+')
        sql_file = File(file_handle)
        sql = sql_file.read()
        cursor.execute(sql)
        cursor.close()

    def test_repeatable_task_done(self):
        # ...

    def test_one_time_task_done(self):
        # ...

由于某种原因,当我只有一个测试用例处于活动状态时,不会发生此错误(为什么?)。直到将测试的基类从$ python manage.py test app.tests Creating test database for alias 'default'... System check identified no issues (0 silenced). ...E.. ====================================================================== ERROR: test_repeatable_task_done (app.tests.test_views.TaskDoneViewTest) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/asmox/AppDev/Python/bubblechecklist/project_root/app/tests/test_views.py", line 80, in setUp cursor.execute(sql) File "/home/asmox/AppDev/Python/bubblechecklist/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 68, in execute return self._execute_with_wrappers(sql, params, many=False, executor=self._execute) File "/home/asmox/AppDev/Python/bubblechecklist/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers return executor(sql, params, many, context) File "/home/asmox/AppDev/Python/bubblechecklist/env/lib/python3.6/site-packages/django/db/backends/utils.py", line 80, in _execute self.db.validate_no_broken_transaction() File "/home/asmox/AppDev/Python/bubblechecklist/env/lib/python3.6/site-packages/django/db/backends/base/base.py", line 437, in validate_no_broken_transaction "An error occurred in the current transaction. You can't " django.db.transaction.TransactionManagementError: An error occurred in the current transaction. You can't execute queries until the end of the 'atomic' block. 更改为TestCase为止,该错误一直存在。 >

好吧,我想问为什么会发生这种情况,以及是否有任何解决方案可以通过简单的TransactionTestCase类来解决这个问题,因为目前我的测试与事务无关,而且我也找到了这种可行的解决方案肮脏,但是...

我更可能会坚持主要问题,即在全球范围内(对于我所有的测试用例)执行以下操作:

创建测试数据库后,请从提供的文件中再执行一个自定义SQL。它会创建所需的视图

您能帮我怎么做吗?

1 个答案:

答案 0 :(得分:1)

如果您阅读documentation for TestCase,将会看到它把每个测试包装在一个双重事务中,一个在类级别,另一个在测试级别。 setUp()方法针对每个测试运行,因此位于此双重包装内。

如上述文档所示,建议您使用setUpTestData()在类级别上设置数据库。您也可以在此处向数据库添加初始数据,以供所有测试使用。