Rspec,测试对象接收方法

时间:2014-11-16 01:29:41

标签: ruby-on-rails rspec

我有一个代码未通过测试但在控制台中工作的示例。

测试失败:

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对象。

任何人都能理解这里发生了什么?

1 个答案:

答案 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语句的注释令人困惑,因为在检查期望之前,您似乎提出错误。