как разобрать json из ActiveModel::Serializer обратно в объекты

У меня есть куча сериализаторов. Теперь я хотел бы превратить JSON обратно в исходные объекты для тестирования. Я не вижу способа сделать это с помощью ActiveModel::Serializers. Похоже, раньше был метод from_json, который устарел. Как вы должны это сделать?

В основном я хочу проверить круговое путешествие следующим образом:

json = WidgetSerializer.new(@widget).to_json
testw = Widget.new
testw.from_json(json) #from_json doesn't exist in ActiveModel::Serializers
@widget.should == testw

Но метод from_json в модели неправильно считывает json из сериализатора, потому что он не в ожидаемом формате.


person nont    schedule 03.09.2014    source источник


Ответы (1)


Лучшее, что я могу придумать, это использовать либо Widget.find(), либо Widget.find_by(), в зависимости от атрибутов, которые вы передаете своему сериализатору (и особенно, если один из них является уникальным атрибутом)

Например, если ваш сериализатор включает id (самый простой в вашем случае):

   json = WidgetSerializer.new(@widget).to_json
   target_id = JSON.parse(json)[:id]
   test_widget = Widget.find(target_id)
   @widget.should == test_widget
person Matthieu    schedule 11.09.2015
comment
к сожалению, это приведет к получению объекта из базы данных, а не из json, что противоречит цели модульного теста. (Я не сказал это явно для модульного теста, но .should == - это подсказка) - person nont; 13.09.2015
comment
Конечно, он получает его из базы данных, иначе как это может быть == ? Даже если ваш метод from_json вернет новый виджет с точно такими же атрибутами, значения id и created_at будут другими. (Я понимаю, что вы просите модульный тест, но я не совсем понимаю, что вы тестируете — не забыли ли вы включить все атрибуты в сериализатор?) - person Matthieu; 14.09.2015
comment
да, я хотел проверить, что сериализатор работает. это сложный объект с вложенными дочерними объектами. - person nont; 15.09.2015
comment
Я понимаю (думаю, ваш вопрос был сформулирован нечетко, но теперь я понимаю). вы не должны проверять равенство объектов, создавая тестовый виджет, потому что они никогда не будут одинаковыми (идентификатор и т. д.). Вы должны определить свой собственный метод сравнения, который проверяет один за другим атрибуты вашего объекта по сравнению с атрибутами, хранящимися в json. - person Matthieu; 15.09.2015