Stubbing ActionMailer at Rspec

Greetings!
I am trying to test a controller method with rspec that looks like this:

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 

And the relevant specification looks like this:

 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 

When the test passes, I get this message:

 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: 0x00000009816268@ /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: 0x00000009816268@ /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)>' 

I scattered the puts instructions on the controller method, as well as the email_customer method, so I know that he is completing the course and using the correct method, but I'm not sure why it failed. I assume this is a stupid syntax error that I'm not sure about. Thanks in advance for your help!

+6
source share
1 answer

The expect message should appear before calling the method that you want to test, since they actually close the message in the object:

 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 
+9
source

Source: https://habr.com/ru/post/972727/


All Articles