2014-07-23 21 views
6

Anrede!
Ich versuche, eine Controller-Methode mit Rspec zu testen, die wie folgt aussieht: Stubbing ActionMailer in Rspec

def email_customer 
    @quote = Quote.find(params[:quote_id]) 
    hash = { 
    quote: @quote, 
    body: params[:email_body], 
    subject: params[:email_subject] 
    } 
    QuoteMailer.email_customer(hash).deliver 
    redirect_to edit_quote_path params[:quote_id] 
end 

und die entsprechende Spezifikation sieht wie folgt aus:

describe 'POST email_customer' do 
    let!(:quote) { create(:valid_quote) } 
    it 'assigns the quote and sends the customer an email' do 
    post :email_customer, quote_id: quote.id 
    expect(assigns(:quote)).to eq(quote) 
    expect(QuoteMailer).to receive(:email_customer).with(an_instance_of(Hash)).and_return(double('QuoteMailer', deliver: true)) 
    end 
end 

Wenn der Test allerdings läuft, bekomme ich diese Nachricht:

Failure/Error: expect(QuoteMailer).to receive(:email_customer).with(an_instance_of(Hash)).and_return(double('QuoteMailer', deliver: true)) 
     (<QuoteMailer (class)>).email_customer(an instance of Hash) 
      expected: 1 time with arguments: (#<RSpec::Matchers::AliasedMatcher:0x0000000c2b1e28 @description_block=#<Proc:[email protected]/home/david/.rvm/gems/ruby-2.1.1/gems/rspec-expectations-3.0.0.beta2/lib/rspec/matchers.rb:231 (lambda)>, @base_matcher=#<RSpec::Matchers::BuiltIn::BeAnInstanceOf:0x0000000c2b1e50 @expected=Hash>>) 
      received: 0 times with arguments: (#<RSpec::Matchers::AliasedMatcher:0x0000000c2b1e28 @description_block=#<Proc:[email protected]/home/david/.rvm/gems/ruby-2.1.1/gems/rspec-expectations-3.0.0.beta2/lib/rspec/matchers.rb:231 (lambda)>, @base_matcher=#<RSpec::Matchers::BuiltIn::BeAnInstanceOf:0x0000000c2b1e50 @expected=Hash>>) 
    # ./spec/controllers/quotes_controller_spec.rb:28:in `block (3 levels) in <top (required)>' 

Ich habe puts Anweisungen in der Controller-Methode verstreut wie wir ll als die email_customer Methode, also weiß ich, dass es seinen Kurs und die richtige Methode am Laufen hält, aber ich bin nicht sicher, warum es das scheitert. Ich vermute es ist ein dummer Syntaxfehler, über den ich mir nicht sicher bin. Vielen Dank im Voraus für Ihre Hilfe!

+0

schreiben Sie Ihre 'expect's _before_' die Post' –

+0

ahh, ich hatte vorher versucht beides vor dem post zu setzen, was mir einen fehler bei der angabe von @quote gab, aber mit dem stub vor dem post funktionierte es einwandfrei! Danke mein Herr! Wenn Sie das eine Antwort machen, werde ich es akzeptieren – davidicus

Antwort

9

Nachricht expect ations vor den Aufruf der Methode erscheinen sollten Sie testen wollen, da sie die Nachricht tatsächlich in dem Objekt Stummel:

describe 'POST email_customer' do 
    let!(:quote) { create(:valid_quote) } 
    it 'assigns the quote and sends the customer an email' do 
    expect(QuoteMailer).to receive(:email_customer).with(an_instance_of(Hash)).and_return(double('QuoteMailer', deliver: true)) 

    post :email_customer, quote_id: quote.id 

    expect(assigns(:quote)).to eq(quote) 
    end 
end 
+0

mit 'expect (ordnet (: quote)). zu eq (quote)', bevor der Beitrag mich zu diesem Fehler führt: 'Fehler/Fehler: expect (assignes (: quote) zu eq (quote): erwartet: # habe: – davidicus

+0

@davidicus - könnte es sein, dass es einfach nicht besteht? (der Wert, den es erhält, ist "nil") –

+0

nein, wenn ich mich bewege 'expect (assigns (: quote)). zu eq (quote)' zu _after_ 'post: email_customer, quote_id: quote.id' es passiert – davidicus

Verwandte Themen