include 匹配器

使用 include 匹配器指定集合包含一个或多个预期对象。 如果给定集合中的任何对象通过指定的匹配器,则它会成功。 这适用于响应 #include? 的任何对象(例如字符串或数组)

  expect("a string").to include("a")
  expect("a string").to include(/a|str/).twice
  expect("a string").to include("str", "g")
  expect("a string").not_to include("foo")

  expect([1, 2]).to include(1)
  expect([1, 2]).to include(1, 2)
  expect([1, 2]).to include(a_kind_of(Integer))
  expect([1, 2]).to include(be_odd.and be < 10 )
  expect([1, 2]).to include(be_odd)
  expect([1, 2]).to include(be < 10).at_least(2).times
  expect([1, 2]).not_to include(17)

匹配器还为哈希提供了灵活的处理方式

  expect(:a => 1, :b => 2).to include(:a)
  expect(:a => 1, :b => 2).to include(:a, :b)
  expect(:a => 1, :b => 2).to include(:a => 1)
  expect(:a => 1, :b => 2).to include(:b => 2, :a => 1)
  expect(:a => 1, :b => 2).to include(match(/b/) => 2)
  expect(:a => 1, :b => 2).to include(match(/b/) => be_even)
  expect(:a => 1, :b => 2).not_to include(:c)
  expect(:a => 1, :b => 2).not_to include(:a => 2)
  expect(:a => 1, :b => 2).not_to include(:c => 3)

数组用法

假设一个名为“arrayincludematcher_spec.rb”的文件,其中包含

RSpec.describe [1, 3, 7] do
  it { is_expected.to include(1) }
  it { is_expected.to include(3) }
  it { is_expected.to include(7) }
  it { is_expected.to include(1, 7) }
  it { is_expected.to include(1, 3, 7) }
  it { is_expected.to include(a_kind_of(Integer)) }
  it { is_expected.to include(be_odd.and be < 10) }
  it { is_expected.to include(be_odd).at_least(:twice) }
  it { is_expected.not_to include(be_even) }
  it { is_expected.not_to include(17) }
  it { is_expected.not_to include(43, 100) }

  # deliberate failures
  it { is_expected.to include(4) }
  it { is_expected.to include(be_even) }
  it { is_expected.to include(be_odd).at_most(2).times }
  it { is_expected.not_to include(1) }
  it { is_expected.not_to include(3) }
  it { is_expected.not_to include(7) }
  it { is_expected.not_to include(1, 3, 7) }

  # both of these should fail since it includes 1 but not 9
  it { is_expected.to include(1, 9) }
  it { is_expected.not_to include(1, 9) }
end

我运行 rspec array_include_matcher_spec.rb

那么输出应该包含以下所有内容

20 个示例,9 个失败
预期 [1, 3, 7] 包含 4
预期 [1, 3, 7] 包含(为偶数)
预期 [1, 3, 7] 包含(为奇数)最多两次,但它包含 3 次
预期 [1, 3, 7] 不包含 1
预期 [1, 3, 7] 不包含 3
预期 [1, 3, 7] 不包含 7
预期 [1, 3, 7] 不包含 1、3 和 7
预期 [1, 3, 7] 包含 9
预期 [1, 3, 7] 不包含 1

字符串用法

假设一个名为“stringincludematcher_spec.rb”的文件,其中包含

RSpec.describe "a string" do
  it { is_expected.to include("str") }
  it { is_expected.to include("a", "str", "ng") }
  it { is_expected.to include(/a|str/).twice }
  it { is_expected.not_to include("foo") }
  it { is_expected.not_to include("foo", "bar") }

  # deliberate failures
  it { is_expected.to include("foo") }
  it { is_expected.not_to include("str") }
  it { is_expected.to include("str").at_least(:twice) }
  it { is_expected.to include("str", "foo") }
  it { is_expected.not_to include("str", "foo") }
end

我运行 rspec string_include_matcher_spec.rb

那么输出应该包含以下所有内容

10 个示例,5 个失败
预期 “a string” 包含 “foo”
预期 “a string” 不包含 “str”
预期 “a string” 包含 “str” 至少两次,但它只包含一次
预期 “a string” 包含 “foo”
预期 “a string” 不包含 “str”

哈希用法

假设一个名为“hashincludematcher_spec.rb”的文件,其中包含

RSpec.describe :a => 7, :b => 5 do
  it { is_expected.to include(:a) }
  it { is_expected.to include(:b, :a) }
  it { is_expected.to include(:a => 7) }
  it { is_expected.to include(:b => 5, :a => 7) }
  it { is_expected.not_to include(:c) }
  it { is_expected.not_to include(:c, :d) }
  it { is_expected.not_to include(:d => 2) }
  it { is_expected.not_to include(:a => 5) }
  it { is_expected.not_to include(:b => 7, :a => 5) }

  # deliberate failures
  it { is_expected.not_to include(:a) }
  it { is_expected.not_to include(:b, :a) }
  it { is_expected.not_to include(:a => 7) }
  it { is_expected.not_to include(:a => 7, :b => 5) }
  it { is_expected.to include(:c) }
  it { is_expected.to include(:c, :d) }
  it { is_expected.to include(:d => 2) }
  it { is_expected.to include(:a => 5) }
  it { is_expected.to include(:a => 5, :b => 7) }

  # Mixed cases--the hash includes one but not the other.
  # All 4 of these cases should fail.
  it { is_expected.to include(:a, :d) }
  it { is_expected.not_to include(:a, :d) }
  it { is_expected.to include(:a => 7, :d => 3) }
  it { is_expected.not_to include(:a => 7, :d => 3) }
end

我运行 rspec hash_include_matcher_spec.rb

那么输出应该包含以下所有内容

22 个示例,13 个失败
预期 {:a => 7, :b => 5} 不包含 :a
预期 {:a => 7, :b => 5} 不包含 :b 和 :a
预期 {:a => 7, :b => 5} 不包含 {:a => 7}
预期 {:a => 7, :b => 5} 不包含 {:a => 7, :b => 5}
预期 {:a => 7, :b => 5} 包含 :c
预期 {:a => 7, :b => 5} 包含 :c 和 :d
预期 {:a => 7, :b => 5} 包含 {:d => 2}
预期 {:a => 7, :b => 5} 包含 {:a => 5}
预期 {:a => 7, :b => 5} 包含 {:a => 5, :b => 7}
预期 {:a => 7, :b => 5} 包含 :d
预期 {:a => 7, :b => 5} 不包含 :a
预期 {:a => 7, :b => 5} 包含 {:d => 3}
预期 {:a => 7, :b => 5} 不包含 {:a => 7}

计数用法

假设一个名为“includematcherwithcountsspec.rb”的文件,其中包含

  RSpec.describe [{:c => 7}, {:a => 1}, {:b => 2}, {:c => 1}, {:a => 3}, {:c => 7}] do
    it { is_expected.to include(:b => 2).exactly(1).times }
    it { is_expected.to include(:b => 2).once }
    it { is_expected.to include(have_key(:a)).twice }
    it { is_expected.to include(have_key(:c)).at_least(2).times }
    it { is_expected.to include(have_key(:a)).at_least(:once) }
    it { is_expected.to include(have_key(:c)).at_least(:twice) }
    it { is_expected.to include(have_key(:d)).at_most(:once) }
    it { is_expected.to include(have_key(:b)).at_most(:twice) }

    # deliberate failures
    it { is_expected.not_to include(have_key(:b)).once }
    it { is_expected.not_to include(have_key(:a)).twice }
    it { is_expected.not_to include(have_key(:c)).at_least(2).times }
    it { is_expected.not_to include(have_key(:d)).at_most(:once) }
  end

我运行 rspec include_matcher_with_counts_spec.rb

那么输出应该包含以下所有内容

12 个示例,4 个失败
预期 [{:c => 7}, {:a => 1}, {:b => 2}, {:c => 1}, {:a => 3}, {:c => 7}] 不包含 (具有键 :b) 一次
预期 [{:c => 7}, {:a => 1}, {:b => 2}, {:c => 1}, {:a => 3}, {:c => 7}] 不包含 (具有键 :a) 两次
预期 [{:c => 7}, {:a => 1}, {:b => 2}, {:c => 1}, {:a => 3}, {:c => 7}] 不包含 (具有键 :c) 至少两次
预期 [{:c => 7}, {:a => 1}, {:b => 2}, {:c => 1}, {:a => 3}, {:c => 7}] 不包含 (具有键 :d) 最多一次