我正在将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。它会创建所需的视图
您能帮我怎么做吗?
答案 0 :(得分:1)
如果您阅读documentation for TestCase
,将会看到它把每个测试包装在一个双重事务中,一个在类级别,另一个在测试级别。 setUp()
方法针对每个测试运行,因此位于此双重包装内。
如上述文档所示,建议您使用setUpTestData()
在类级别上设置数据库。您也可以在此处向数据库添加初始数据,以供所有测试使用。