DRF-сериализатор высмеиваемого объекта возвращает объект Mock для атрибутов

Я пишу тест pytest и хочу подражать несуществующей модели, которая имеет вложенные под-объекты со своими значениями. Когда я затем сериализую высмеиваемый объект, данные возвращают другой высмеиваемый объект вместо значения для высмеиваемого объекта.

def sub_object(status):
    sub-object_mock = mock.MagicMock()
    sub-object.status = status
    sub-object.user = UserFactory()
    sub-object.created = timezone.now()

    return sub-object_mock

@pytest.fixture
def object_with_sub_object():
    object_with_sub-object = mock.MagicMock()
    sub_object_1 = sub_object("new")
    sub_object_2 = sub_object("declined")
    object_with_sub_object.sub_object = [sub_object_1, sub_object_2]

    return object_with_history

@pytest.mark.django_db
def test_status_serializer_mixin(object_with_sub_object):
    output = StatusSerializerMixin(object_with_sub_object.sub_object[0]).data

Проверка object_with_sub_object.sub_object[0].status дает new, но StatusSerializerMixin(object_with_sub_object.sub_object[0]).data["status"] дает '<MagicMock name=\'mock.status_.status\' id=\'139783810861768\'>'

Если заменить sub-object.status = status на sub-object.status = mock.PropertyMock(return_value=status), то object_with_sub_object.sub_object[0].status даст <PropertyMock name='mock.status' id='139783815428640'>.

Любая помощь в написании вложенных подражаний будет принята с благодарностью.

Поскольку data['status'] содержит '<MagicMock name=\'mock.status_.status\' id=\'139783810861768\'>, доступ сериализатора: sub-object.status_.status, поэтому вы должны написать:

def sub_object(status):
    sub-object_mock = mock.MagicMock()
    status-object_mock = mock.MagicMock()
    sub-object_mock.status_ = status-object_mock
    status-object_mock.status = status
    sub-object_mock.user = UserFactory()
    sub-object_mock.created = timezone.now()
    return sub-object_mock

Если это не то поведение, которое вы ожидали, вам нужно исправить ваш сериализатор (вы должны предоставить код сериализатора в вопросе).

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