2014-06-13 3 views
0

Im écrire un test pour un travailleur qui va chercher les courriels ne puis quelque chose avec eux:Stub 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 

Quelle est la meilleure façon de bouchonner Net::POP3.start de telle manière qu'il retourner des données similaires devrait-il réellement fonctionner?

Merci

Dickie

Edit:

Le reste du travail/remplissant le #do something ressemble un peu à ceci:

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 

La solution que je suis venu avec est (qui peut être un peu spécifique pour vos besoins):

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") 

Ce que je n'aime pas vraiment.

Réécriture en utilisant certaines des techniques que @SteveTurczyn utilise.

Répondre

1

est ici un « chemin heureux » de plusieurs e-mails ...

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

Merci pour votre réponse. J'aurais probablement dû être plus clair dans ce que je faisais avec le mail. Je suis en train de traiter les pièces jointes à l'email. En fin de compte, ma solution n'était pas trop différente de la vôtre. Bien que je préfère la façon dont vous l'avez fait. Je poste ma solution puis une solution mise à jour. – DickieBoy