2014-07-23 22 views
6

Saluti!
sto cercando di testare un metodo di controllo con Rspec che assomiglia a questo: 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 

e il corrispondente spec si presenta così:

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 

Quando il test viene eseguito, però, ottengo questo messaggio:

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)>' 

ho sparso mette dichiarazioni durante il metodo di controllo come noi ll come metodo email_customer, quindi so che termina il suo corso e utilizza il metodo giusto, ma non sono sicuro del motivo per cui non ci riesce. Immagino sia uno stupido errore di sintassi di cui non sono sicuro. Grazie in anticipo per il vostro aiuto!

+0

Scrivi la 'expect's _prima_ il' POST' –

+0

ahh, in precedenza avevo provato a mettere entrambi gli aspetti prima del post, il che mi dava un errore riguardo l'assegnazione di @quote, ma con lo stub prima del post funzionava perfettamente! Grazie Signore! se lo fai una risposta lo accetterò – davidicus

risposta

9

Messaggio expect zioni dovrebbero comparire davanti la chiamata al metodo che si desidera verificare, dal momento che in realtà stub il messaggio nell'oggetto:

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

avendo 'expect (assegna (: quote)). a eq (quote)' prima che il post mi porti a questo errore: 'Fallimento/Errore: expect (assegna (: quota)) .eq (quote): attesi: # ottenuto: nil' – davidicus

+0

@davidicus - potrebbe essere che semplicemente non passi? (il valore che riceve è 'nil') –

+0

no perché quando mi sposto' expect (assegna (: quote)) a eq (quota) 'a _after_' post: email_customer, quote_id: quote.id' passa – davidicus

Problemi correlati