2013-07-31 17 views
10

RSpecを使用してRails 3.2でメソッドが電子メールをトリガーするかどうかをテストしようとしています。私のテストに合格。Rails RSpecテスト:未定義メソッド '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: "[email protected]", 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'

答えて

25

おかしいの受信

、私はちょうどこのAをしなければならなかった エラーundefined method 'deliver' for nil:NilClass

を取得しています数時間前に。あなたはスタブする必要がありますそれを怒らせるのを止めるために、配送方法を外してください。そうでなければ、 should_receiveは、メソッドが deliverを呼び出すときにはnilを返します。それは nil.deliverです。

これは動作するはずです:

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

RSpecのはand_call_originalを持っているあなたは、元の動作を変更する必要がない場合。 (doc) あなたの場合、Mailer.should_receive(:weekly_email).and_call_originalを使用できます。

+0

これは正解でなければなりません – MarkJL