Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rspec: ActionMailer::Base.deliveries should be empty

Testing filling in the contact form without filling in one of the required fields in one test and then filling in the honey_pot field in another test. The tests when valid info is filled in are passing, but the two other specs are failing.

Update I've been running the test a couple of times and sometimes all the tests pass. Other times, the same specs fail.

Terminal output

  3) Pages Home page it should behave like all static pages Footer Contact Form when honeypot is filled does not send an email
     Failure/Error: expect(ActionMailer::Base.deliveries).to be_empty
       expected empty? to return true, got false
     Shared Example Group: "all static pages" called from ./spec/requests/pages_spec.rb:69
     # ./spec/requests/pages_spec.rb:46:in `block (6 levels) in <top (required)>'

  4) Pages Home page it should behave like all static pages Footer Contact Form when fields are not filled does not send an email
     Failure/Error: expect(ActionMailer::Base.deliveries).to be_empty
       expected empty? to return true, got false
     Shared Example Group: "all static pages" called from ./spec/requests/pages_spec.rb:69
     # ./spec/requests/pages_spec.rb:38:in `block (6 levels) in <top (required)>'

pages_spec.rb

require 'spec_helper'                                                                                                                                    

describe "Pages" do                                                                                                                                      

  subject { page }                                                                                                                                       

  shared_examples_for "all static pages" do |path_name|                                                                                                  
    before { visit send(path_name) }                                                                                                                     

    describe "Footer" do                                                                                                                                 

      describe "Contact Form" do                                                                                                                         
        it { should have_selector('h7', text: 'Contact Us') }                                                                                            

        context "when a valid message" do                                                                                                                

          it "sends an email" do                                                                                                                         
            post contact_create_path, message: attributes_for(:message)                                                                                  
            expect(ActionMailer::Base.deliveries.last.to).to eq(["#{ENV["MVP_USERNAME"]}"])                                                              
            ActionMailer::Base.deliveries.clear                                                                                                          
          end                                                                                                                                            
        end                                                                                                                                              

        context "when fields are not filled" do                                                                                                          
          it "does not send an email" do                                                                                                                 
            post contact_create_path, message: attributes_for(:message, name: '', body: '')                                                              
            expect(ActionMailer::Base.deliveries).to be_empty                                                                                            
            ActionMailer::Base.deliveries.clear                                                                                                          
          end                                                                                                                                            
        end                           
      end                                                                                                                                              

        context "when honeypot is filled" do                                                                                                             
          it "does not send an email" do                                                                                                                 
            post contact_create_path, message: attributes_for(:message, sweet_honey: 'bot')                                                              
            expect(ActionMailer::Base.deliveries).to be_empty                                                                                            
            ActionMailer::Base.deliveries.clear                                                                                                          
          end                                                                                                                                            
        end                                                                                                                                              
      end                                                                                                                                                
    end                                                                                                                                                  
  end                

  describe "Home page" do                                                                                                                                
    before { visit root_path }                                                                                                                           
    it_should_behave_like "all static pages", :root_path                                                                                                 
    it { should have_text('Quality Cars') }                                                                                                              
    it { should have_title('Misawa Used Cars - Misawa Auto Sales') }                                                                                     

    describe "Send a message" do                                                                                                                         
      before do                                                                                                                                          
        fill_in "Name", with: 'name'                                                                                                                     
        fill_in "Email", with: '[email protected]'                                                                                                       
        fill_in "Phone", with: '999-9999-9999'                                                                                                           
        fill_in "Body", with: 'Hello'                                                                                                                    
        click_button "Send"                                                                                                                              
      end                                                                                                                                                

      describe "after the message is sent" do                                                                                                            

        it "should render the desired page with a flash" do                                                                                              
          expect(page).to have_text('Quality Cars')                                                                                                      
          expect(page).to have_title('Misawa Used Cars - Misawa Auto Sales')                                                                             
          expect(page).to have_selector('.alert-box.success')                                                                                            
        end                                                                                                                                              
      end                                                                                                                                                
    end                                                                                                                                                  
  end    
end
like image 750
Patrick Avatar asked Mar 19 '26 09:03

Patrick


1 Answers

I was able to get the specs passing by clearing the ActionMailer::Base.deliveries before and after each of the specs where I tested the deliveries. I also rewrote the tests to make it DRYer using the before(:each) and after(:each) methods describe in Rspec's documentation. Update Even better, around(:each)

Improved Specs

  describe "Contact Form" do                                                                                                                         
    it { should have_selector('h7', text: 'Contact Us') }                                                                                            

    describe "send a message" do                                                                                                                     
      around(:each) { ActionMailer::Base.deliveries.clear }                                                                                                                                                                                   

      context "when a valid message" do                                                                                                              
        it "sends an email" do                                                                                                                       
          post contact_create_path, message: attributes_for(:message)                                                                                
          expect(ActionMailer::Base.deliveries.last.to).to eq(["#{ENV["MVP_USERNAME"]}"])                                                            
        end                                                                                                                                          
      end                                                                                                                                            

      context "when fields are not filled" do                                                                                                        
        it "does not send an email" do                                                                                                               
          post contact_create_path, message: attributes_for(:message, name: '', body: '')                                                            
          expect(ActionMailer::Base.deliveries).to be_empty                                                                                          
        end                                                                                                                                          
      end                                                                                                                                            

      context "when honeypot is filled" do                                                                                                           
        it "does not send an email" do                                                                                                               
          post contact_create_path, message: attributes_for(:message, sweet_honey: 'bot')                                                            
          expect(ActionMailer::Base.deliveries).to be_empty                                                                                          
        end                                                                                                                                          
      end                                                                                                                                            
    end                                                                                                                                              
  end        
like image 71
Patrick Avatar answered Mar 21 '26 21:03

Patrick



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!