带有序列化字段的工厂女孩

问题描述 投票:2回答:2

我在工厂女工中遇到这个问题,它给我一个undefined method 'each' for #<String:0x0000012915bc18>错误,工厂中有一个序列化字段。

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

我的问题是:如何在工厂中格式化序列化的对象?活动记录返回的方式?或它实际存储在数据库中的方式? (即是否已序列化?)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
2个回答
5
投票

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

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

0
投票

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

FactoryGirl.define do
  factory :series1_episodes, class: Tvdb do
    term { 'episodes_79488' }
    cache { %i[dsada dsadsada].to_json }
  end  
end
© www.soinside.com 2019 - 2024. All rights reserved.