2014-07-23 18 views
6

Zwroty!
Próbuję przetestować metodę kontrolera z RSpec, który wygląda tak: Stubbing ActionMailer w 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 

i odpowiadająca specyfikacji wygląda następująco:

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 

Kiedy test przebiega jednak uzyskać ta wiadomość:

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

Mam rozproszone umieszcza oświadczenia w całej metody kontrolera, jak my Będę jako metoda email_customer, więc wiem, że kończy się to jego biegiem i używa właściwej metody, ale nie jestem pewien, dlaczego to się nie udało. Zgaduję, że to głupi błąd w składni, którego nie jestem pewien. Z góry dziękuje za twoją pomoc!

+0

napisać swój 'expect's _before_ Opcja' Post' –

+0

ahh, wcześniej próbowałem wystawić obydwa oczekiwania przed postem, co dało mi błąd co do przypisania @quote, ale z wyprzedzeniem przed postem działało bezbłędnie! Dziękuję Panu! jeśli podasz tę odpowiedź, przyjmuję to: – davidicus

Odpowiedz

9

wiadomości expect ations powinien pojawić przed wezwanie do metody, którą chcesz przetestować, ponieważ faktycznie skrótową wiadomość w obiekcie:

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

mając 'expect (przypisuje (: quote)). do eq (quote)' zanim post doprowadzi mnie do tego błędu: 'Failure/Error: expect (assigns: (quote)) do eq (quote): oczekiwano: # dostał: zero ' – davidicus

+0

@davidicus - czy to możliwe, że po prostu nie przechodzi? (wartość, którą otrzymuje to 'nil') –

+0

nie, ponieważ po przeniesieniu' oczekiwać (przypisuje (: cytować)) do eq (cytować) 'do _ po '' post: email_customer, quote_id: quote.id' to przekazuje – davidicus

Powiązane problemy