2017-05-16 6 views
0
나는 방법 온도를 실행 내 방법을 테스트 할

과 같은 방법을 기대 :RSpec에 허용하고 다른 인수 :: Service.run 두 번 내부

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 

내가의 두 번째 통화에 제공하는 인수를 테스트 할 메서드 : 첫 번째 인수 'step2'를 사용하여 실행 동일한 메서드의 첫 번째 호출을 무시하려면 : 첫 번째 인수는 'step1'이지만 무시하십시오.

나는 RSpec에 테스트

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 

가지고 있지만 어떻게 정확히 같은 방법을 허용 사용하고 기대하는 오류

expected: "step2" 
    got: "step1" 

(compared using ==) 

있어?

+0

기대를 누락 것 같다, 그래서. 그냥'expect (Temp :: Service) .to ('step2', "arg3"=> "v3") {true}'를 받아 (: run) .with를 사용하십시오. – fanta

+0

두 번째 인수보다 더 복잡한 검사를하고 싶습니다. 그래서 나는 그것을 블록으로 만들었다. 이와같이 ' [ 'arg3', 'arg4']. each do | arg_good | expect (p [arg_good]). not_to be_nil 끝 ' –

답변

1

당신이 블록에 무슨 일을하는지 할 필요가 없습니다, 당신은 당신을 위해 전송 매개 변수를 확인합니다 .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

작동합니다! 감사합니다 –

+0

@ MaxIvak no prob! :) –