Django. Как создать экземпляр модели в тестовой базе данных с помощью objects fabric?
Я хочу сделать функцию setUp моих юнит-тестов чистой от повторения тонны строк создания модели типа 1) создать пользователя 2) теперь создать сотрудника с fk для этого пользователя и т.д. Для этого я сделал простую фабрику фиктивных объектов, но, возможно, я сделал какие-то ошибки или просто что-то не так понял. Вот кусок фабрики (dummy_data - это просто куча dicts):
from abc import ABC
from users.models import User
from employees.models import Employee
from .dummy_data import(
user_data,
employee_data,
)
class DummyObjectFactory(ABC):
"""Fabric representing dummy test objects"""
def get_dummy_object(self):
"""Return dummy object"""
class DummyUser(DummyObjectFactory):
def get_dummy_object(self) -> User:
return User.objects.create_user(**user_data)
class DummyEmployee(DummyObjectFactory):
def get_dummy_object(self) -> Employee:
user = DummyUser().get_dummy_object()
return Employee.objects.create(**employee_data, user=user)
Затем я делаю точечный словарь всех видов тканей для удобства их вызова buy dummy_factory.Name . Моя идея заключалась в том, что я вызываю ткань с нужным именем модели, и она создает свой экземпляр.
Проблема в том, что когда я вызываю его в методе setUp некоторого теста, например так test_user = dummy_factory.User
он создает объект в реальной базе данных, но я хочу, чтобы он был в тестовой базе данных.
Да, я искал решение и нашел библиотеки Factory boy и Faker, но я хочу завершить свою ткань, заставить ее работать правильно. Спасибо за внимание.
Так что у меня все получилось. Я сделал следующее:
Добавили декоратор @abstractmethod в абстрактный класс.
Каждый конкретный фабричный метод должен иметь декоратор @classmethod и получать cls в качестве аргумента:
.class DummyUser(DummyObjectFactory):
@classmethod def get_dummy_object(cls) -> User: return User.objects.create_user(**user_data)
Все работает как задумано: фабрика создает объекты в тестовой бд. Спасибо за участие.