2014-12-02 96 views
7

過去了,如果參數傳遞就像我可以測試:測試一個塊與RSpec的嘲弄

RSpec.describe do 
    it do 
    obj = double 
    expect(obj).to receive(:method).with(1, 2, 3) 
    obj.method(1, 2, 3) 
    end 
end 

我應該怎麼辦關於塊參數?我的理想代碼:

RSpec.describe do 
    it do 
    obj = double 
    proc = Proc.new{} 
    expect(obj).to receive(:method).with(1, 2, 3).with_block(proc) 
    obj.method(1, 2, 3, &proc) 
    end 
end 
+0

在Rspec問題上請求此功能https://github.com/rspec/rspec-mocks/issues/1182 – hakunin 2017-09-25 10:07:05

回答

0

您不能使用期望來測試是否傳遞了特定的塊。您可以檢查代碼中加入代碼裏面,例如運行:

RSpec.describe do 
    it do 
    obj = double 
    block_is = double('block') 
    block = -> { 
     block_is.run 
    } 

    expect(obj).to receive(:method).with(1, 2, 3).and_yield 
    expect(block_is).to receive(:run) 

    obj.method(1, 2, 3, &block) 
    end 
end 
+0

謝謝。 and_yield有點棘手但有趣。 – sh01ch1 2014-12-05 07:38:43

+0

嗯,我只能使用:'allow(obj).to接收(:方法).with(1,2,3,&a_proc)。和_return(a_value)''。它和預期的一樣。編輯:meh,rspec只是忽略塊) – Waterlink 2015-05-10 20:30:33

6

看來,如果一個塊與方法鏈過去了,我不能簡單地測試。而且我發現一個平淡的回答,模塊實現:

RSpec.describe do 
    it do 
    obj = double 
    proc = Proc.new{} 
    expect(obj).to receive(:method).with(1, 2, 3) do |*args, &block| 
     expect(proc).to be(block) 
    end 
    obj.method(1, 2, 3, &proc) 
    end 
end 

但是,我們不能在同一時間像receive(:method).with(1, 2, 3){|*| ...}.and_call_original使用塊執行和其他響應配置方法。

+0

我不知道你是否可以通過在塊實現中使用'super(* args,&block)'來模擬'.and_call_original' .... – Ajedi32 2015-05-15 17:15:04

+0

RSpec應該返回do塊中的最後一條語句: – 2015-07-01 03:18:29