Загрузить/выгрузить прибор из/в строку json в django unittest

У меня есть пользовательская модель в django с переопределенными методами to_python() и get_db_prep_save(). Я обнаружил ошибку: при сбросе и перезагрузке данные были несогласованными. Ошибка исправлена, но я хочу протестировать ее с помощью простой строки json.

Мой вопрос: как я могу вызвать loaddata/dumpdata внутри unittest.

Я хочу создать следующие сценарии:

from django.test import TestCase
class CustomModelTest(TestCase):
    def test_load_fixture(self):
        mydata = '[{"model": "some_app.custommodel", "pk": 1, "fields": {"custom_field": "some correct value"}}]'
        django.some_interface_to_load_fixture.loaddata(mydata) // data could be as json string, file, stream
        make some assertions on database model custommodel

    def test_dump_fixture(self):
        mymodel = create model object with some data
        result = django.some_interface_to_dump_fixture.dumpdata()
        make some assertions on result

Я знаю, что есть поле fixture=[], которое можно использовать в юнит-тестах django, оно может решать сценарии загрузки фикстур. Но если бы кто-нибудь мог указать мне какой-нибудь интерфейс для загрузки или вывода данных о приборах по запросу, это было бы здорово.


person makozaki    schedule 26.09.2019    source источник
comment
Можете ли вы опубликовать свои методы сброса и перезагрузки? а также почему бы вам просто не использовать для этого модуль json?   -  person Yugandhar Chaudhari    schedule 26.09.2019
comment
Я спрашиваю, есть ли уже какие-то методы в djago для этого. Код — это просто концепция. Я могу настроить данные в соответствии с существующим интерфейсом, если он есть. Я предполагаю, что есть. Если я могу загрузить данные с помощью python manage.py loaddata data.json, должен быть какой-то интерфейс, который можно использовать непосредственно в модуле django в юнит-тестах.   -  person makozaki    schedule 26.09.2019
comment
Django делает это, используя этот from django.core.serializers.json import Serializer,Deserializer   -  person Yugandhar Chaudhari    schedule 26.09.2019
comment
Как насчет использования команды управления loaddata? Вы также можете просто вызвать его в коде.   -  person dirkgroten    schedule 26.09.2019
comment
Вы можете создать экземпляр Command, а затем запустить execute с аргументами, которые примет команда управления. Посмотрите исходный код, чтобы увидеть, какие аргументы потребуются (вы должны передать значения по умолчанию, если вы не звоните из командной строки)   -  person dirkgroten    schedule 26.09.2019
comment
@YugandharChaudhari Это то, что я искал. Большое спасибо! Ваш комментарий привел меня к правильной документации по django Сериализация объектов Django   -  person makozaki    schedule 26.09.2019


Ответы (1)


Благодаря @YugandharChaudhari comment Я нашел решение, используя django.core.serializers:

import json
from django.core import serializers
from django.test import TestCase
from some_app.models import CustomModel

class CustomModelTest(TestCase):
    def test_deserializing(self):
        test_data = [
            {"model": "some_app.custommodel",
             "pk": 1,
             "fields":
                 {
                     "custom_field": "some correct value"}
             }
        ]
        result = list(serializers.deserialize('json', json.dumps(test_data)))
        self.assertEqual(result[0].object.custom_field, 'some data after deserialization')

    def test_serializing(self):
        custom_model_obj = CustomModel(id=1, custom_field='some data')
        result_json = json.loads(serializers.serialize('json', [custom_model_obj]))
        self.assertEqual('some data after serialization', result_json[0]['fields']['custom_field'])
person makozaki    schedule 26.09.2019
comment
Рад, что помог :) - person Yugandhar Chaudhari; 26.09.2019