2017-09-19 58 views
1

如何驗證Foobar#some_method是否需要一個塊。東西simliar到Foobar.new.respond_to?(:some_method)測試一個方法是否需要一個塊

class Foobar 
    def some_method 
    yield 
    end 
end 

爲什麼?

這對測試合同界面很有用。確保我存根的方法有一個不變的API。

方法我試過

mth = Foobar.new.method(:some_method) 
mth.parameters 

這個返回的參數列表(什麼Rspec的主要用途)。它的工作原理,如果我有一個這樣的參數作爲塊:

def some_method(&blk) 
end 

但是,如果方法使用yield相反,我什麼都沒有從#parameters

這是爲了添加規格,以確保界面與醜陋的外部世界。所以我知道如何使用一種方法。但是,如果有API更改,我希望規範失敗。

回答

3

我如何可以驗證,如果Foobar#some_method需要一個塊。

每個方法在紅寶石需要(可以採取)塊。它可能只是選擇不屈服。所以這就是你需要檢查,我想:如果方法產生或沒有。

RSpec的有一些產量預期:https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/yield-matchers

RSpec.describe "yield_control matcher" do 
    specify { expect { |b| MyClass.yield_once_with(1, &b) }.to yield_control } 
    specify { expect { |b| MyClass.dont_yield(&b) }.not_to yield_control } 
    specify { expect { |b| MyClass.yield_twice_with(1, &b) }.to yield_control.twice } 
    specify { expect { |b| MyClass.yield_twice_with(1, &b) }.to yield_control.exactly(2).times } 
    specify { expect { |b| MyClass.yield_twice_with(1, &b) }.to yield_control.at_least(1) } 
    specify { expect { |b| MyClass.yield_twice_with(1, &b) }.to yield_control.at_most(3).times } 

end 

因此,對於你的情況應該是這樣的:

expect{ foobar.some_method }.to yield_control 
+0

謝謝。忘了提到這個作品,但我需要在我正在使用的庫中存儲一些方法。如果我不做任何剔除,特別是考慮到庫中的實現細節,那將會很好。任何其他的選擇? –

相關問題