Pytest Fixture для использования БД на основе файла sqlite для тестирования?
Я использую pytest
и pytest-django
для тестирования проекта Django.
У меня есть test_settings.py
, который я использую для того, чтобы использовать базы данных in-memory. Она очень проста и выглядит следующим образом:
from .settings import *
# Set up in memory databases for testing purposes
DATABASES = {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ":memory:",
},
"other_db": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": ":memory:",
},
}
Моя pytest.ini
столь же проста:
[pytest]
DJANGO_SETTINGS_MODULE = ic_project.test_settings
python_files = tests.py test_*.py *_tests.py
Есть несколько мест, где я хотел бы протестировать, используя реальный .sqlite3
файл - не в памяти.
Поэтому я попробовал написать следующее приспособление:
@pytest.fixture(scope="function")
def file_based_db(settings):
"""Generator to create a file based database for testing"""
settings.DATABASES["default"]["TEST"] = {
"ENGINE": "django.db.backends.sqlite3",
"NAME": "default_db.sqlite3",
}
settings.DATABASES["other_db"]["TEST"] = {
"ENGINE": "django.db.backends.sqlite3",
"NAME": "other_db.sqlite3",
}
Итак, тест, в котором я хотел бы использовать эту 'file_based_db', будет выглядеть примерно так:
@pytest.mark.usefixtures("file_based_db")
class ThingForm(TransactionTestCase):
def setUp(self):
self.thing = Thing.objects.create(name="thing1")
def test_empty_form_fields(self):
form = MyForm()
self.assertIn("created_by", form.fields)
self.assertIn("deleted_at", form.fields)
self.assertIn("updated_by", form.fields)
breakpoint()
Однако, когда я запускаю это, я получаю следующую ошибку:
return [
alias for alias in connections
if alias in cls.databases and (
> include_mirrors or not connections[alias].settings_dict['TEST']['MIRROR']
)
]
E KeyError: 'MIRROR'
В конечном итоге, как вы видите, я просто пытаюсь добавить словарь базы данных "TEST" в settings.DATABASES
- но мне это нужно только в определенных случаях.
Если есть другие способы сделать это? Я буду рад услышать о том, как - я думал, что pytest fixture будет работать отлично, чтобы я мог просто украсить несколько тестов, где я хочу этого.
Любая помощь была бы признательна - поскольку я не уверен, к чему относится KeyError: 'MIRROR'
.