Rspec:如何测试子串在字符串中出现一定次数?

时间:2014-05-12 21:00:01

标签: ruby-on-rails rspec

尝试使用.exactly方法,但这似乎不起作用。

expect(data).to include(purchase.email).exactly(3).times

这会产生错误:

 NoMethodError:
   undefined method `exactly' for #<RSpec::Matchers::BuiltIn::Include:0x007f85c7e71108>
 # ./spec/models/csv_generator_spec.rb:34:in `block (4 levels) in <top (required)>'
 # ./spec/models/csv_generator_spec.rb:18:in `each'
 # ./spec/models/csv_generator_spec.rb:18:in `block (3 levels) in <top (required)>'

有谁知道我会如何测试子字符串在字符串中出现一定次数?

2 个答案:

答案 0 :(得分:9)

您可以使用scan方法,该方法返回一系列匹配项。然后你只需检查数组的大小:

expect(data.scan(purchase.email).size).to eq(3)

另一种选择是这种语法:

expect(data.scan(purchase.email)).to have(3).items

expect(data.scan(purchase.email)).to have_exactly(3).items

答案 1 :(得分:1)

你也可以使用像这样的重复正则表达式

来做到这一点
r = %r{(#{purchase.email}).*\1.*\1.*}

然后,期望在rspec中使用regexp matcher,

match = data.match(r)
expect(data).to match(r)
expect(match[1]).to be_eql(purchase.email)