【问题标题】:Factory Girl with serialized field有序列化字段的工厂女孩
【发布时间】:2012-01-07 01:01:19
【问题描述】:

我遇到了工厂女孩的这个问题,它给了我一个 undefined method 'each' for #<String:0x0000012915bc18> 错误,其中包含来自工厂的序列化字段。

在 ActiveRecord 中,它运行 each 没有问题,因为返回的对象是一个数组。

我的问题是:我应该如何格式化我工厂中的序列化对象?活动记录返回它的方式?还是它实际存储在数据库中的方式? (即是否序列化?) rspec 在保存和检索活动记录时会执行相同的序列化魔术吗?

这是我正在做的事情的简化版本:

Tvdb.rb-- 型号

class Tvdb < ActiveRecord::Base

  set_table_name 'tvdb'
  serialize :cache

  def self.episodes(id)
    cached = self.find_by_term('episodes_' + id.to_s)
    return cached.cache unless cached.nil?

    info = self.series_info(id)
    request = info.episodes

    Tvdb.create(:term=>'episodes_' + info.id.to_s, :cache=>request)
    return request
  end
end

然后在我的 Series.rb 模型中我可以这样做:

class Series < ActiveRecord::Base

  def episodes
    episodes = Tvdb.episodes(self.tvdb_id)
    episodes.each do |episode|
      puts episode.name
    end
  end

end

Tvdb.rb -- 工厂

FactoryGirl.define do
  factory :series1_episodes, :class=>Tvdb do
    term 'episodes_79488'
    cache %q([#<AnObject::Module:0x000001290a4568 @value="dsada"]>,#<AnObject::Module:0x0002321290a4568 @value="dsadsada"]> )
  end  
end

注意:这里缓存值的语法可能无效,我试图缩短一个很长的序列化对象。关键是它适用于我的模型,但不适用于 rspec

在我的 *series_spec.rb* 中调用这个:

series.episodes.count.should_not == 0

给出那个错误

undefined method 'each' for #<String:0x0000012915bc18>

【问题讨论】:

    标签: ruby-on-rails serialization rspec factory-bot


    【解决方案1】:

    在您的工厂中,您不应将cache 设置为序列化值,而应设置为实际值。

    FactoryGirl.define do
      factory :series1_episodes, :class => Tvdb do
        term 'episodes_79488'
        cache ["foo", "bar"]
      end
    end
    

    【讨论】:

      【解决方案2】:

      您可以通过这种方式将其更改为 JSON:

      FactoryGirl.define do
        factory :series1_episodes, class: Tvdb do
          term { 'episodes_79488' }
          cache { %i[dsada dsadsada].to_json }
        end  
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        • 1970-01-01
        相关资源
        最近更新 更多