Rails RSpec测试:nil的未定义方法'deliver':NilClass

yel*_*ign 11 rspec ruby-on-rails rspec-rails

我试图测试一个方法是否使用RSpec在我的Rails 3.2中触发电子邮件.它在生产和开发中起作用,我无法让它通过我的测试.

我收到了错误 undefined method 'deliver' for nil:NilClass

# user_spec.rb
it "should send an email if user has weekly email set to true" do
  @user = FactoryGirl.create(:user, user_name: "Jane Doe", email: "jane@gmail.com", weekly_email: true, weekly_article_count: 10)
  Mailer.should_receive(:weekly_email)
  User.send_weekly_email
end

# user.rb
scope :weekly_email, where(:weekly_email => true)
scope :weekly_article_count, :conditions => ["weekly_article_count IS NOT NULL"]

def self.send_weekly_email
  @users = User.weekly_email.weekly_article_count
  @users.each do |user|
    Mailer.weekly_email(user).deliver
  end
end
Run Code Online (Sandbox Code Playgroud)

我也试过使用Mailer.should_receive(:weekly_email).with(user),但后来我收到了错误undefined local variable or method 'user'

Phi*_*rom 26

好笑,我几个小时前就得这么做了.您还需要将交付方法存根,以防止它被吓坏.否则should_receive,当您的方法调用deliver它时,您的返回值为nil nil.deliver.

这应该工作:

Mailer.should_receive(:weekly_email).and_return( double("Mailer", :deliver => true) )
Run Code Online (Sandbox Code Playgroud)


小智 21

and_call_original如果您不需要更改原始行为,则Rspec具有.(doc)在你的情况下,你可以使用Mailer.should_receive(:weekly_email).and_call_original.