2014-06-13 26 views
0

我寫一個測試肚裏,並得到電子郵件,然後一個工人做了他們:存根的Net :: POP3.start

Net::POP3.start('pop.gmail.com', 995, "xxx", "xxxx") do |pop| 
    if pop.mails.empty? 
    log "#{Time.now} No mail." 
    else 
    pop.each_mail do |mail| 
     #do something 
    end 
    end 
end 

什麼是這樣,這將存根Net::POP3.start的最佳方式實際上應該返回相似的數據嗎?

感謝

迪基

編輯:

作業的其餘/在#do something填充看起來有點像這樣:

Net::POP3.start('pop.gmail.com', 995, "xxx", "xxxx") do |pop| 
    if pop.mails.empty? 
    log "#{Time.now} No mail." 
    else 
    pop.each_mail do |mail| 
     parse_mail mail.pop 
    end 
    end 
end 


def parse_mail(raw_email) 
    email = Mail.new raw_email 
    email.attachments 
    email.from 
    email.subject 
end 

我想出瞭解決的方法是(這可能會根據您的需求有所不同):

Net::POP3.stub(:start).and_yield Net::POP3.new("a test string") 
Net::POP3.any_instance.stub(:mails).and_return [Net::POPMail.new("test","test","test","test")] 
Net::POPMail.any_instance.stub(:pop).and_return("a raw email string") 

我不太喜歡。

使用@SteveTurczyn正在使用的一些技術重構它。

回答

1

這裏的幾封電子郵件的「幸福路」 ......

require 'spec_helper' 
module NET 
    module POP3 
    end 
end 
describe "testing NET::POP3" do 
    before do 
    @mail1 = double('mail1') 
    @mail2 = double('mail2') 
    @mail3 = double('mail3') 
    @pop = double('pop') 
    @pop.stub_chain(:mails, :empty?).and_return false 
    allow(@pop).to receive(:each_mail).and_yield(@mail1).and_yield(@mail2).and_yield(@mail3) 
    expect(NET::POP3).to receive(:start).and_yield(@pop) 
    end 
    describe "three emails pending" do 
    it "will return a pop entity" do 
     NET::POP3.start do |p| 
     expect(p).to eq(@pop) 
     end 
    end 
    it "pop will indicate that emails are not empty" do 
     NET::POP3.start do |p| 
     expect(p.mails.empty?).to be_false 
     end 
    end 
    it "pop will contain three mails" do 
     NET::POP3.start do |p| 
     counter = 0 
     p.each_mail do |m| 
      counter += 1 
      expect([@mail1, @mail2, @mail3]).to include(m) 
     end 
     expect(counter).to eq 3 
     end 
    end 
    end 

end 
+0

感謝您的答覆。我可能應該更清楚我對電子郵件所做的工作。我正在處理電子郵件的附件。最後,我的解決方案與您的解決方案不太相似。儘管我更喜歡你做到這一點的方式。我發佈我的解決方案,然後更新解決方案 – DickieBoy