2013-07-31 29 views
10

Tôi đang cố kiểm tra xem một phương thức kích hoạt một email trong Rails 3.2 của tôi bằng RSpec hay không. vượt qua thử nghiệm của tôi.Rails RSpec Testing: Phương thức không xác định 'phân phối' cho nil: NilClass

tôi nhận được lỗi 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: "[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 

tôi cũng đã cố gắng sử dụng Mailer.should_receive(:weekly_email).with(user), nhưng sau đó tôi nhận được lỗi undefined local variable or method 'user'

Trả lời

25

Funny, tôi chỉ phải làm một này vài giờ trước Bạn cần phải khai ra phương pháp cung cấp cũng như ngăn chặn nó từ freaking ra. Nếu không, số should_receive của bạn sẽ trả về 0% khi phương thức của bạn gọi số deliver gọi là nil.deliver.

này nên làm việc:

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

RSpec có and_call_original nếu bạn không cần phải thay đổi hành vi ban đầu. (doc) Trong trường hợp của bạn, bạn có thể sử dụng Mailer.should_receive(:weekly_email).and_call_original.

+0

Đây phải là câu trả lời đúng – MarkJL