英文:
How to set up test db settings in a DRF project?
问题
以下是翻译好的内容:
"我正在在一个使用MongoDB和Djongo连接器的DRF项目中运行单元测试。当我逐个运行测试时,它们都能够成功编译,但当我使用 python3 manage.py test test.path
运行它们时,除了第一个测试之外,其余都失败。日志中的以下行指示存在关于删除测试数据库的问题。
FAILED SQL: DROP DATABASE "test_my_project_name"
以下是数据库配置。
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'my_project_name',
'CLIENT': {
'host': os.environ[DB_HOST],
}
},
'test': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'test_mytestdatabase',
'USER': 'mytestdatabaseuser',
'PASSWORD': 'mytestpassword',
'HOST': 'localhost',
'PORT': '5432',
}
}
我需要做什么来确保测试期间使用测试数据库而不是主数据库?还需要设置其他任何内容来进行测试吗?"
英文:
I'm running unit tests in a drf project with a mongo db and djongo connector. When I run tests one by one they compile successfully but when I run all of them with python3 manage.py test test.path
they all fail except the first test. The following line from the logs indicates that there is an issue with dropping the test database.
FAILED SQL: DROP DATABASE "test_my_project_name"
Here's the database configuration.
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'my_project_name',
'CLIENT': {
'host': os.environ[DB_HOST],
}
},
'test': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'test_mytestdatabase',
'USER': 'mytestdatabaseuser',
'PASSWORD': 'mytestpassword',
'HOST': 'localhost',
'PORT': '5432',
}
}
What do I need to do to make the test db be used during tests and not the main db.
Also do I need to set up anything else for the testing?
答案1
得分: 0
During tests, Django使用默认配置。唯一的区别是,在每次测试之前和之后,它会创建和销毁一个以test_
前缀命名的测试数据库,该数据库名称与您的默认数据库名称相同,只是多了前缀。您的错误表明它无法删除test_my_project_name
数据库 - 您的默认数据库名称是my_project_name
,而您的“test”数据库名称是test_mytestdatabase
。
您需要采用不同的方法,可以在这个Stack Overflow答案中找到详细说明。
简而言之,您必须为测试使用完全不同的DATABASES
配置:
import sys
if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydatabase'
}
我建议将此条件存储为设置变量之一,例如:
TEST_MODE = 'test' in sys.argv
然后,您可以在运行时用它来执行许多操作(日志记录、存根、跳过某些验证等)。
英文:
During tests django use default config. Only difference is that before and after each test, it creates and destroys test db named after your default db with test_
prefix.
Your error confirms that by saying it cannot drop test_my_project_name
database - your default db name is my_project_name
while your "test" db name is test_mytestdatabase
.
You'll have to use different approach explained in this SO answer.
In short, you must use entirely different DATABASES
config for testing:
import sys
if 'test' in sys.argv:
DATABASES['default'] = {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'mydatabase'
}
I would suggest storing that condition as one of the settings variables, for example
TEST_MODE = 'test' in sys.argv
and then you can use it for many things in runtime (logging, stubs, skip some validation, etc...)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论