Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用Django';在多个数据库上使用原子_请求测试客户端?_Python_Django_Unit Testing - Fatal编程技术网

Python 如何使用Django';在多个数据库上使用原子_请求测试客户端?

Python 如何使用Django';在多个数据库上使用原子_请求测试客户端?,python,django,unit-testing,Python,Django,Unit Testing,我在我的设置.py中设置了两个数据库,每个数据库都有原子请求: 数据库={ “默认值”:{ “引擎”:“django.db.backends.postgresql_psycopg2”, 'NAME':'lolomg', 'USER':'lolomg', “密码”:“密码”, '主机':'本地主机', “端口”:“5432”, “原子请求”:True, }, “分析”:{ “引擎”:“django.db.backends.postgresql_psycopg2”, “名称”:“分析”, 'USER

我在我的
设置.py中设置了两个数据库,每个数据库都有
原子请求

数据库={
“默认值”:{
“引擎”:“django.db.backends.postgresql_psycopg2”,
'NAME':'lolomg',
'USER':'lolomg',
“密码”:“密码”,
'主机':'本地主机',
“端口”:“5432”,
“原子请求”:True,
},
“分析”:{
“引擎”:“django.db.backends.postgresql_psycopg2”,
“名称”:“分析”,
'USER':'lolomg',
“密码”:“密码”,
'主机':'本地主机',
“端口”:“5432”,
“原子请求”:True,
},
}
如果我然后编写任何使用Django的测试客户机的测试,例如

来自django.test的
导入测试用例
类TestEndpoints(TestCase):
def测试手册(自我):
self.client.get(“api/v1/books”)
我将得到一个回溯和一个异常,如下所示:

======================================================================
FAIL: test_books (lolomg.books.tests.test_api.EndpointsTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/jordi/vcs/lolomg/lolomg/books/tests/test_api.py", line 6, in test_books
    resp = self.client.get(self.url)
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/test/client.py", line 535, in get
    response = super().get(path, data=data, secure=secure, **extra)
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/test/client.py", line 347, in get
    **extra,
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/test/client.py", line 422, in generic
    return self.request(**r)
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/test/client.py", line 503, in request
    raise exc_value
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/usr/lib/python3.7/contextlib.py", line 73, in inner
    with self._recreate_cm():
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/db/transaction.py", line 175, in __enter__
    if not connection.get_autocommit():
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/db/backends/base/base.py", line 379, in get_autocommit
    self.ensure_connection()
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/db/backends/base/base.py", line 217, in ensure_connection
    self.connect()
  File "/home/jordi/vcs/lolomg/lib/python3.7/site-packages/django/test/testcases.py", line 144, in __call__
    raise AssertionError(self.message)
AssertionError:此测试中不允许数据库连接到“analytics”。将“分析”添加到lolomg.books.tests.test\u api.EndpointsTests.databases,以确保正确的测试隔离并消除此故障。

通过跟踪堆栈跟踪,我们看到这是因为由于设置了
原子_请求
,测试客户端试图为
分析
数据库建立事务。然而,自Django 2.2以来,现在必须在测试中显式启用与数据库的连接,而不是
default

这很酷,但实际上我根本不想为了这个测试连接到
analytics
数据库。事实上,只有少数几个测试需要连接到这个数据库,所以即使把这个数据库考虑到所有其他测试也是错误的。 虽然我可以对使用测试客户机的任何测试类执行
databases='\uuuuuuuu all\uuuuuu'
,但这似乎也是错误的。我只是不希望测试客户机试图对大多数测试的分析数据库做任何事情


那么我应该怎么做呢?如何在每个数据库上保留
原子请求
,但仅为实际需要的测试启用
分析
数据库?

我对Django 2还不是非常熟悉,但似乎实现这一点的唯一方法可能是禁用分析在测试运行程序中打开数据库,然后在涉及它的测试中显式地重新打开它


我认为这并不理想,因为您将在与代码运行环境不同的环境中运行测试,但我不确定是否有其他方法不只是为所有测试启用所有数据库。

我想我可能会接受这个答案。Django在使用
UserWarning执行此操作时会抱怨:覆盖设置数据库可能会导致意外行为。
但我不知道还能做什么。