2013-07-31 17 views
10

Sto provando a verificare se un metodo attiva un'email nel mio Rails 3.2 utilizzando RSpec. Funziona in produzione e sviluppo, non riesco a ottenerlo superare la mia prova.Rails RSpec Testing: metodo non definito 'deliver' per nil: NilClass

sto ottenendo l'errore 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 

ho anche provato ad utilizzare Mailer.should_receive(:weekly_email).with(user), ma poi ricevo l'errore undefined local variable or method 'user'

risposta

25

divertente, ho dovuto fare questo un un paio d'ore fa. Devi stubare anche il metodo di consegna per evitare che impazzisca. Altrimenti il ​​tuo should_receive restituisce zero, quindi quando il tuo metodo chiama deliver chiama nil.deliver.

Questo dovrebbe funzionare:

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

Rspec ha and_call_original se non c'è bisogno di cambiare il comportamento originale. (doc) Nel tuo caso, puoi utilizzare Mailer.should_receive(:weekly_email).and_call_original.

+0

Questa dovrebbe essere la risposta corretta – MarkJL

Problemi correlati