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

Ruby on rails Rspec:如何测试子字符串在字符串中出现一定次数?,ruby-on-rails,rspec,Ruby On Rails,Rspec,尝试使用。确切地说是方法,但在这里似乎不起作用 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 `bl

尝试使用
。确切地说是
方法,但在这里似乎不起作用

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)>'
命名错误:
未定义的方法“精确地”用于#
#./spec/models/csv_generator_spec.rb:34:in'block(4层)in'
#./spec/models/csv_generator_spec.rb:18:in'each'
#./spec/models/csv_generator_spec.rb:18:in“块(3层)in”
有人知道我将如何测试子字符串在字符串中出现一定次数吗?

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

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

您也可以使用重复的正则表达式模式来执行此操作

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)

但这并不涉及重复次数。因此,@fivedigit提出的解决方案更加简洁。