10

वर्तमान में मेरी नियंत्रक कल्पना में मेरे पास है:मैं एक आरईपीसी नियंत्रक परीक्षण कैसे लिखूं जो सुनिश्चित करता है कि एक ई-मेल भेजा गया है?

require 'spec_helper' 

describe CustomerTicketsController do 
    login_user 

    describe "POST /create (#create)" do 
    # include EmailSpec::Helpers 
    # include EmailSpec::Matchers 
    it "should deliver the sales alert email" do 
     # expect 
     customer_ticket_attributes = FactoryGirl.attributes_for(:customer_ticket) 
     customer_mailer = mock(CustomerMailer) 
     customer_mailer.should_receive(:deliver). 
     with(CustomerTicket.new(customer_ticket_attributes)) 
     # when 
     post :create, :customer_ticket => customer_ticket_attributes 
    end 
    end 
end 

मेरी नियंत्रक में मेरे पास है:

# POST /customer_tickets 
    # POST /customer_tickets.xml 
    def create 
    respond_to do |format| 
     if @customer_ticket.save 
     CustomerMailer.sales_alert(@customer_ticket).deliver 
     format.html { redirect_to @customer_ticket, notice: 'Customer ticket was successfully created.' } 
     format.xml { render xml: @customer_ticket, status: :created, location: @customer_ticket } 
     else 
     format.html { render action: "new" } 
     format.xml { render xml: @customer_ticket.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

मेरा परीक्षण वर्तमान में निम्नलिखित उत्पादन का उत्पादन:

Failures: 

    1) CustomerTicketsController POST /create (#create) should deliver the sales alert email 
    Failure/Error: customer_mailer.should_receive(:deliver). 
     (Mock CustomerMailer).deliver(#<CustomerTicket id: nil, first_name: "firstname1", last_name: "lastname1", company: nil, referral: nil, email: "[email protected]", phone: "555-5555", fax: nil, country: nil, address1: "555 Rodeo Dr.", address2: nil, city: "Beverly Hills", state: "CA", postcode: "90210", question: "The answer to the universe is 4.", type: nil, status: nil, priority: nil, number: nil, cs_rep_id: nil, created_at: nil, updated_at: nil>) 
      expected: 1 time 
      received: 0 times 
    # ./spec/controllers/customer_ticket_controller_spec.rb:13:in `block (3 levels) in <top (required)>' 

Finished in 0.52133 seconds 
1 example, 1 failure 

Failed examples: 

rspec ./spec/controllers/customer_ticket_controller_spec.rb:9 # CustomerTicketsController POST /create (#create) should deliver the sales alert email 

धन्यवाद आप देखने के लिए

उत्तर

18

आप ActionMailer :: Base.deliveries.count सुनिश्चित करने के लिए यह इस (untested) की तरह से 1.

कुछ वृद्धि की जाती है

expect {custom_mailer.deliver}.to change { ActionMailer::Base.deliveries.count }.by(1) 
+2

मैंने उम्मीद पोस्ट के अंदर 'पोस्ट: बनाएं,: ग्राहक_टिकेट => ग्राहक_टिकेट_एट्रिब्यूट' रखा है, और ऐसा लगता है कि यह काम कर रहा है। – jklina

1

आपके द्वारा स्थापित किए जा रहे मोजे वास्तव में जो निष्पादित किए जा रहे हैं उससे मेल नहीं खाते हैं। आपको उस मॉक पर वास्तव में deliver पर कॉल करना होगा।

तरह

message = mock('Message') 
CustomerMailer.should_receive(:sales_alert).and_return(message) 
message.should_receive(:deliver) 

पास करना चाहिए कुछ।

यदि आप यह देखना चाहते हैं कि sales_alert पर क्या किया गया है, तो आप जो काम कर रहे हैं, वह काम नहीं करेगा - सक्रिय रिकॉर्ड केवल प्राथमिक कुंजी समानता द्वारा वस्तुओं की तुलना करता है ताकि ग्राहक टिकट जो आप spec में बना रहे हैं, बराबर नहीं होगा आपके नियंत्रक में बनाए गए एक के लिए।

एक बात तुम कर सकते हो

CustomerMailer.should_receive(:sales_alert) do |arg| 
    ... 
end.and_return(message) 

rspec जो कुछ sales_alert साथ कहा जाता है निकलेगा और आप जो कुछ भी की जाँच करता है आप चाहते हैं

यह CustomerTicket.new बाहर ठूंठ है ऐसा करने का एक और तरीका है सकते हैं, इसलिए है आप तो पर नियंत्रण है कि यह क्या देता है, उदाहरण के

mock_ticket = mock(CustomerTicket) 
CustomerTicket.should_receive(:new).with(customer_ticket_attributes).and_return(mock_ticket) 
mock_ticket.should_receive(:save).and_return(true) 
CustomerMailer.should_receive(:sales_alert).with(mock_ticket).and_return(message) 

अंत में आप तय कर सकते हैं कि इस सूचना को भेजने वास्तव में एक में संबंधित होना चाहिए के लिए CustomerTicket की उदाहरण विधि, जिस स्थिति में आपका कंट्रोलर स्पेक सिर्फ यह जांच सकता है कि टिकट पर send_sales_alert विधि कॉल की गई थी।

0

जांच कर सकता है इस तरह से परीक्षण करने के लिए कैसे मेलर है सही तर्क के साथ बुलाया।

delivery = double 
expect(delivery).to receive(:deliver_now).with(no_args) 

expect(CustomerMailer).to receive(:sales_alert) 
    .with(customer_ticket) 
    .and_return(delivery) 
संबंधित मुद्दे

 संबंधित मुद्दे