我有一个代码未通过测试但在控制台中工作的示例。
测试失败:
describe ImporterProfile do
it 'sends defaults method to EventAttribute model' do
expect(ListPage).to receive(:new) #passes
expect(EventAttribute).to receive(:new) #fails
ImporterProfile.new.standard_profile
end
1) ImporterProfile standard_profile sends new method to associated objects
Failure/Error: importer_profile.standard_profile
NoMethodError:
undefined method `each' for nil:NilClass
# ./app/models/importer_profile.rb:51:in `standard_profile'
# ./spec/models/importer_profile_spec.rb:29:in `block (3 levels) in <top (required)>'
模特:
class ImporterProfile < ActiveRecord::Base
has_one :list_page, dependent: :delete
has_many :event_attributes, dependent: :delete_all
accepts_nested_attributes_for :list_page
accepts_nested_attributes_for :event_attributes
def standard_profile
self.list_page = ListPage.new
self.event_attributes = EventAttribute.new
end
end
class EventAttribute < ActiveRecord::Base
belongs_to :importer_profile
end
class ListPage < ActiveRecord::Base
belongs_to :importer_profile
end
但是,在控制台中运行此方法会实例化一个新的ImporterProfile,ListPage和几个EventAttribute对象。
任何人都能理解这里发生了什么?
答案 0 :(得分:0)
我怀疑问题是你在嘲笑EventAttribute.new
,但只返回nil
,所以Rails无法枚举self.event_attributes =
语句所要求的活动记录。 (它需要将EventAttribute
记录的外键属性设置为ImporterProfile
记录的id。)
如果你不介意继续执行,你可以这样做:
expect(EventAttribute).to receive(:new).and_call_original
或者,您可以返回一个double,但是您需要为ActiveRecord
所需的任何方法提供存根,方法是使用http://rubygems.org/gems/rspec-active_record_mocks/versions/0.1.4之类的库或自己滚动。
顺便说一句,如果您提供了一些方法将错误堆栈跟踪中的行号与您提供的源相关联,那么这个问题就会更容易回答。此外,第一次传递和第二次传递失败的expect
语句的注释令人困惑,因为在检查期望之前,您似乎提出错误。