2016-10-28 6 views
0

Rspecのカスタムマッチャー。マッチドブロックとは何ですか?私はRSpecのからこのコードを読んでいます

require 'rspec/expectations' 

RSpec::Matchers.define :be_a_multiple_of do |expected| 
    match do |actual| 
    actual % expected == 0 
    end 
end 

RSpec.describe 9 do 
    it { is_expected.to be_a_multiple_of(3) } 
end 

match doブロックとは何ですか?それはproc内のブロックですか?構文は少し奇妙です... defineメソッドは2つの引数をとります。最初のシンボルはシンボルで、2番目のシンボルはProcですか?

フードの下で... actualはどのように整数9を参照していますか?このコードで何が起こっている

答えて

2
expect(object).to eq(value) 
     |   | | 
     |   | expected (matcher argument) 
     |   | 
     actual  | 
       matcher 

RSpec::Matchers.define :be_a_multiple_of do |expected| 

RSpec::Matcher.defineが呼び出されると、それは整合(この場合be_a_multiple_ofある)とブロック

名前をそれに渡された引数が渡されブロックはと予想されます値です。これは、整合引数として渡された値である一致メソッドが呼び出されるブロック Inisde be_a_multiple_of(3)

match do |actual| 

、この場合になりスペックを、実行時これもブロックを通過します。このブロックには、の実際のという1つの引数があります。これは、マッチャーが呼び出されたときにexpectに渡される値です。 、expect(9).to be_multipe_of(3)

だろう。この場合、ブロックはちょうどまたはを返すためにactualexpectedを使用して、いくつかの計算を行います。

どのように実際に9を参照していますか?すなわちhereを述べたように、それは、最も外側の例グループに引数として渡されるので、値が例基ため被写体として公開されている。この場合

RSpec.describe 9 do 

書き込みと同じですsubject { 9 }

RSpec docis_expectedをチェックすると基本的にはと同じです。

{ is_expected.to be_a_multiple_of(3) } 

{ expect(subject).to be_a_multiple_of(3) } 

そしてに渡された以前のオブジェクトが方法は試合メソッドに渡されたブロックの実際引数として使用されるものである期待述べたと同様です。つまり、actual9

関連する問題