【问题标题】:how to parse json from ActiveModel::Serializer back into objects如何将 ActiveModel::Serializer 中的 json 解析回对象
【发布时间】:2014-10-28 05:13:31
【问题描述】:

我有一堆序列化程序。现在我想将 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,因为它不是预期的格式

【问题讨论】:

    标签: ruby-on-rails json serialization active-model-serializers


    【解决方案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
    

    【讨论】:

    • 遗憾的是,这会从数据库中获取对象,而不是从 json 中获取对象,这会破坏单元测试的目的。 (我没有明确说它用于单元测试,但“.should ==”是一个提示)
    • 当然是从数据库中获取的,不然怎么可能==?即使您的 from_json 方法返回了具有完全相同属性的新 Widget,“id”和“created_at”值也会不同。 (我知道你要求进行单元测试,但我不太明白你在测试什么——你没有忘记在序列化器中包含所有属性?)
    • 是的,我想测试序列化程序是否工作。它是一个带有嵌套子对象的复杂对象。
    • 我明白(我认为你的问题没有明确表达,但现在我明白了)。您不应该通过创建测试小部件来测试对象的相等性,因为它们永远不会相同(id 等)。您应该定义自己的比较方法,逐一检查对象的属性与存储在 json 中的属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 2014-11-22
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    相关资源
    最近更新 更多