2013-07-31 26 views
10

Próbuję sprawdzić, czy metoda wyzwala e-mail w moim Rails 3.2 przy użyciu RSpec. Działa w produkcji i rozwoju, po prostu nie mogę go dostać przekazać mój test.Railsy Test RSpec: Niezdefiniowana metoda "dostarcz" dla zero: NilClass

dostaję błąd 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 

ja również próbowałem przy użyciu Mailer.should_receive(:weekly_email).with(user), ale potem dostaję błąd undefined local variable or method 'user'

Odpowiedz

25

śmieszne, po prostu musiałem zrobić to na kilka godzin temu również metodę dostarczania, aby powstrzymać ją od wariowania. W przeciwnym razie Twój should_receive zwróci zero, więc gdy twoja metoda zadzwoni deliver, zadzwoni nil.deliver.

To powinno działać:

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

rspec ma and_call_original jeśli nie trzeba zmieniać oryginalne zachowanie. (doc) W twoim przypadku możesz użyć Mailer.should_receive(:weekly_email).and_call_original.

+0

To powinna być prawidłowa odpowiedź – MarkJL

Powiązane problemy