![](/img/trans.png)
[英]Django DB Router Sending Table to default DB instead of Correct One
[英]Django using default db for unit tests instead of test db
当我运行manage.py test
django 时使用的是我的默认数据库而不是测试数据库。
我是否误解了文档中的某些内容?
根据文档,默认行为是“为测试创建单独的空白数据库” 。
我设置“TEST:NAME”值只是为了确保,但只有在我想配置测试数据库名称而不是默认的test_{dbname}
时才需要文档 state
DATABASES = {
"default": {
"ENGINE": "django.db.backends.postgresql_psycopg2",
"HOST": "0.0.0.0",
"NAME": "mydb_db",
"USER": "postgres",
"PASSWORD": "postgres",
"PORT": 5432,
"TEST": {"NAME": "test_mydb_db"},
}
}
from unittest import TestCase
class SimpleTest(TestCase):
def test_get_user_authorized(self):
client = Client()
breakpoint()
>>> (Pdb) from django.db import connection
>>> (Pdb) connection.settings_dict['NAME']
'mydb_db'
如果我在单元测试中读取或创建数据,数据来自mydb_db
而不是我预期的test_mydb_db
。
正在使用 docker compose 设置数据库,但我认为这不会影响任何事情:
services:
db:
container_name: postgres
image: postgres:9.6
restart: always
volumes:
- postgres_data:/var/lib/postgresql/data/
ports:
- "5432:5432"
environment:
POSTGRES_DB: mydb_db
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
在这里回答我自己的问题。 发帖后马上想通了。 看起来我错过了文档中的一个重要点
SimpleTestCase
必须继承自django.test.TestCase
而不是unittest.TestCase
才能正确创建测试数据库。
将我的代码更改为此解决了它:
from django.test import TestCase
class SimpleTest(TestCase):
def test_get_user_authorized(self):
client = Client()
breakpoint()
>>> (Pdb) from django.db import connection
>>> (Pdb) connection.settings_dict['NAME']
'test_mydb_db'
文档没有明确说明使用 unittest 不会创建测试数据库,但如果需要 db,它确实建议使用 django 的 TestCase:
如果您的测试依赖于数据库访问,例如创建或查询模型,请务必将您的测试类创建为 django.test.TestCase 而不是 unittest.TestCase 的子类。
使用 unittest.TestCase 避免了在事务中运行每个测试并刷新数据库的成本,但是如果您的测试与数据库交互,它们的行为将根据测试运行器执行它们的顺序而有所不同。 这可能导致单元测试在单独运行时通过,但在套件中运行时失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.