Rspec:ActionMailer :: Base.deliveries应为空

时间:2014-01-29 06:34:53

标签: ruby-on-rails ruby rspec capybara

测试填写联系表单而不填写一个测试中的一个必填字段,然后在另一个测试中填写honey_pot字段。填写有效信息时的测试正在通过,但其他两个规格都失败了。

更新我一直在运行测试几次,有时候所有测试都通过了。其他时候,相同的规格失败。

终端输出

  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@example.com'                                                                                                       
        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

1 个答案:

答案 0 :(得分:2)

我能够通过在我测试交付的每个规范之前和之后清除ActionMailer::Base.deliveries来获取规范。我还重写了测试,使用Rspec's documentation中描述的before(:each)after(:each)方法使其成为DRYer。 更新更好,around(:each)

改进规格

  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