RSpec .to be_empty引发ArgumentError“expect语法不支持运算符匹配器”

时间:2016-09-06 13:41:06

标签: ruby rspec cucumber rspec-expectations

我正在使用Ruby Cucumber来测试应用程序。我的一个步骤定义是:

Then(/^all of my (\.\S+) should not have the below fields:$/) do |path,table|
  #path is my api, table is the fields list I'm sending through cucumber feature file and @result is the json resonse
  expect(JsonPath.on(@result.body,path).flatten.map(&:keys).flatten.uniq & table.raw.flatten).to be_empty
end

令人惊讶的是,这已经开始引发错误

The expect syntax does not support operator matchers, so you must pass a matcher to `#to`. (ArgumentError)

在我的一个新git分支中。即使是现在,主分支也不会对这行代码产生任何错误。

我尝试在与此相关的新分支中搜索代码的任何差异,但没有发现任何内容,甚至没有任何宝石版本的更改。

以下是我尝试过的一些事情:

puts JsonPath.on(@result.body,path).flatten.map(&:keys).flatten.uniq & table.raw.flatten
#[]
var = JsonPath.on(@result.body,path).flatten.map(&:keys).flatten.uniq & table.raw.flatten
puts var.class
#Array

所以,我的&操作导致一个空数组,即[],我在其上应用了rspec匹配器.to be_empty。 来自JSON的具有相同值的相同代码在一个分支中起作用而在另一个分支中不起作用。这不是与机器相关的错误,因为不同机器上的同一分支会引发此错误。

我甚至在这个新分支上更新了我的RSpec gem版本并尝试过,但仍然存在错误。我无法确定此失败的根本原因。救命啊!

1 个答案:

答案 0 :(得分:0)

  

我尝试在相关的新分支中搜索代码的任何差异   对此,但没有发现任何东西,甚至没有任何宝石版本的变化。

如果你在不同的计算机上来回切换时使用相同的宝石版本,那么这个差异中的某些东西会导致问题,无论你认为这种可能性有多大。

如果有许多提交,可以使用git bisect或者通过有选择地将损坏的差异应用到工作区域,直到找到中断的代码来开始剔除差异。

随机猜测:你是否在破坏的差异中定义了empty方法?