我在工厂女工中遇到这个问题,它给我一个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>
在您的工厂中,不应将cache
设置为序列化值,而应将其设置为实际值。
FactoryGirl.define do
factory :series1_episodes, :class => Tvdb do
term 'episodes_79488'
cache ["foo", "bar"]
end
end
您可以通过以下方式将其更改为JSON:
FactoryGirl.define do
factory :series1_episodes, class: Tvdb do
term { 'episodes_79488' }
cache { %i[dsada dsadsada].to_json }
end
end