【问题标题】:Rails RSpec Testing: Undefined method 'deliver' for nil:NilClassRails RSpec 测试:nil:NilClass 的未定义方法“交付”
【发布时间】:2013-07-31 09:16:23
【问题描述】:

我正在尝试使用 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

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

【问题讨论】:

    标签: ruby-on-rails rspec rspec-rails


    【解决方案1】:

    有趣的是,我只是在几个小时前才这样做。您还需要删除 Deliver 方法以防止它被吓坏。否则,您的 should_receive 返回 nil,因此当您的方法调用 deliver 时,它正在调用 nil.deliver

    这应该可行:

    Mailer.should_receive(:weekly_email).and_return( double("Mailer", :deliver => true) )
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多