我遇到了工厂女孩的问题,它给我一个 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>
最佳答案
在工厂中,不应将 cache
设置为序列化值,而应设置为实际值。
FactoryGirl.define do
factory :series1_episodes, :class => Tvdb do
term 'episodes_79488'
cache ["foo", "bar"]
end
end
关于ruby-on-rails - 具有序列化字段的工厂女孩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8281112/