2013-07-31 7 views
10

RSpec kullanarak Rails 3.2 bir e-posta tetikleyen bir yöntem olup olmadığını test etmeye çalışıyorum.Üretim ve geliştirme çalışır, sadece bunu elde edemiyorum sınavımı.Rails RSpec Test: Tanımsız yöntem 'teslim etmek' için nil: NilClass

Ben

# 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 
Ben de Mailer.should_receive(:weekly_email).with(user) kullanarak denedim ama sonra hatasını undefined local variable or method 'user'

cevap

25

Komik almak

, sadece bu a yapmak zorunda hata undefined method 'deliver' for nil:NilClass

alıyorum birkaç saat önce. Teslim yöntemini dışarıda çıldırmaktan vazgeçirmek. Aksi takdirde, numaranız, deliver yöntemini çağırdığında, nil.deliver numaralı telefonu çağırır.

Bu çalışması gerekir:

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

RSpec and_call_original sahiptir özgün davranışını değiştirmek gerek yoksa. (doc) Sizin durumda Mailer.should_receive(:weekly_email).and_call_original'u kullanabilirsiniz.

+0

Bu doğru cevap olmalı – MarkJL