2017-05-16 5 views
0

Ich möchte, dass meine Methode testen, die Methode Temp läuft :: Service.run zweimal im Inneren:Rspec lassen und erwarten, dass die gleiche Methode mit verschiedenen Argumenten

module Temp 
    class Service 

    def self.do_job 
     # first call step 1 
     run("step1", {"arg1"=> "v1", "arg2"=>"v2"}) 


     # second call step 2 
     run("step2", {"arg3"=> "v3"}) 


    end 

    def self.run(name, p) 
     # do smth 

     return true 
    end 


    end 
end 

Ich möchte Argumente zweiten Aufruf zur Verfügung gestellt testen, von Methode: mit dem ersten Argument 'step2' ausführen, während ich den ersten Aufruf der gleichen Methode ignorieren möchte: run aber mit dem ersten Argument 'step1'.

Ich habe den RSpec Test

RSpec.describe "My spec", :type => :request do 

    describe 'method' do 
    it 'should call' do 

     # skip this 
     allow(Temp::Service).to receive(:run).with('step1', anything).and_return(true) 

     # check this 
     expect(Temp::Service).to receive(:run) do |name, p| 
     expect(name).to eq 'step2' 

     # check p 
     expect(p['arg3']).not_to be_nil 

     end 


     # do the job 
     Temp::Service.do_job 

    end 
    end 
end 

aber ich habe Fehler

expected: "step2" 
    got: "step1" 

(compared using ==) 

Wie richtig verwenden, um das gleiche Verfahren zu ermöglichen und erwarten?

+0

Erwartungen fehlen die Parameter für Sie geschickt überprüfen, so, Sie brauchen nicht zu tun, was Sie in dem Block tun. Verwenden Sie 'expect (Temp :: Service) .zu empfangen (: run) .with ('step2'," arg3 "=>" v3 ") {true}'. – fanta

+0

Ich möchte das zweite Argument komplizierter überprüfen. Also habe ich es mit Block gemacht. So ' ['arg3', 'arg4']. Jeder tun | arg_good | erwarten (p [arg_good]). Not_to be_nil Ende' –

Antwort

1

Scheint, wie Sie die .with('step2', anything)

it 'should call' do 

    allow(Temp::Service).to receive(:run).with('step1', anything).and_return(true) 

    # Append `.with('step2', anything)` here 
    expect(Temp::Service).to receive(:run).with('step2', anything) do |name, p| 
    expect(name).to eq 'step2' # you might not need this anymore as it is always gonna be 'step2' 
    expect(p['arg3']).not_to be_nil 
    end 

    Temp::Service.do_job 
end 
+0

es funktioniert! danke –

+0

@MaxIvak kein Problem! :) –

Verwandte Themen