Rspec中的自定义匹配器。什么是匹配阻止?

时间:2016-10-28 17:06:09

标签: ruby 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方法有两个参数;第一个是符号,第二个是Proc

引擎盖下...... actual如何引用整数9?

1 个答案:

答案 0 :(得分: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)和 阻止

传递给该块的参数是预期值。这是运行规范时作为 匹配器参数 传递的值,在这种情况下为 3 be_a_multiple_of(3)

match do |actual|

阻止的Inisde,调用 匹配 方法,该方法也会传递一个块。该块接受一个参数实际,这是在调用匹配器时传递给expect的值。在这种情况下, 9 expect(9).to be_multipe_of(3)

该块仅使用actualexpected进行一些计算,以返回 true false

  

实际如何参考9?

RSpec.describe 9 do

在这种情况下,值 9 会作为 示例组 主题公开,因为它已通过作为所述最外层示例组的参数http://doi2bib.org换句话说,它与写subject { 9 }

相同

如果您选中the approach suggested by @anumi is_expected与撰写expect(subject)基本相同。

{ is_expected.to be_a_multiple_of(3) }

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

如前所述,传递给 expect 方法的对象是用作传递给 match 方法的块的实际参数的对象。这就是actual引用9

的方式