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, но я хочу завершить свою ткань, заставить ее работать правильно. Спасибо за внимание.

Так что у меня все получилось. Я сделал следующее:

  1. Добавили декоратор @abstractmethod в абстрактный класс.

  2. Каждый конкретный фабричный метод должен иметь декоратор @classmethod и получать cls в качестве аргумента:

    .

    class DummyUser(DummyObjectFactory):

     @classmethod
     def get_dummy_object(cls) -> User:
         return User.objects.create_user(**user_data)
    

Все работает как задумано: фабрика создает объекты в тестовой бд. Спасибо за участие.

Вернуться на верх