Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将密钥数组与预定义数组(Ruby)进行比较_Ruby_Arrays_Rspec_Cucumber - Fatal编程技术网

将密钥数组与预定义数组(Ruby)进行比较

将密钥数组与预定义数组(Ruby)进行比较,ruby,arrays,rspec,cucumber,Ruby,Arrays,Rspec,Cucumber,我想将JSON响应中返回的所有结果的键与预定义的键数组进行比较 所以我有这套钥匙 def key_array ["key1", "key2", "key3"] end api调用的响应以@response输出的哈希数组格式返回 当我做@response.keys时,我会得到 我可以使用@response[0]通过其索引单独访问每组键。例如,键将返回 ["key1", "key2", "key3"] 我想对rspec匹配器做的是检查api调用返回的每个结果是否在key_数组中设置了键

我想将JSON响应中返回的所有结果的键与预定义的键数组进行比较

所以我有这套钥匙

def key_array
 ["key1", "key2", "key3"] 
end
api调用的响应以@response输出的哈希数组格式返回

当我做@response.keys时,我会得到

我可以使用@response[0]通过其索引单独访问每组键。例如,键将返回

  ["key1", "key2", "key3"]
我想对rspec匹配器做的是检查api调用返回的每个结果是否在key_数组中设置了键

此刻

expect(@response.keys).to match_array(key_array)
正在将索引数组与我存储的密钥数组相匹配。如何从每个索引中访问键

required_keys = %w{key1 key2 key3}
@response.each do |key, hash|
  next if (key == "Status")
  expect(hash).to include(*required_keys)
end
您可以添加一条可选消息,以查看发生故障的索引:

@response.each do |key, hash|
  next if (key == "Status")
  expect(hash).to include(*required_keys), "Failed at #{key}"
end
下一个检查可以转换为正则表达式检查,以防您有其他要忽略的非数字键,例如

next if /\D/.match(key) # the \D matches non-digits

这对您很有用。

如果您只想调用expect方法一次,您可以这样做

expect( @response.values.map{|h| h.keys.sort}.uniq ).to eq([%w(key1 key2 key3)])

然而,这是一种相当丑陋的方法

我首先要收集不完整的部分:

incompletes = @response.reduce([]) { |memo, kv| 
  (key_array - kv.last.keys).empty? ? memo : memo << kv.first 
}
您是否只需要检查:

incompletes = @response.reject { |*kv| (key_array - kv.last.keys).empty? }
expect(incompletes).to match_array([]) 
前一种方法可以很容易地收集有关错误条目的任何所需信息,因为您可以自由地将任何有价值的内容放入结果数组中。希望能有帮助

具有以下状态的UPD:

incompletes = @response.reject { |k,v| 
# ⇓⇓ is k integer? ⇓⇓  or  ⇓⇓ are valid keys all presented? ⇓⇓
   k.to_i.to_s != k    ||      (key_array - v.keys).empty? 
}
expect(incompletes).to match_array([]) 

感谢所有回答的人,我刚刚注意到我的回答中的status=>100,这会导致迭代出现问题。在我开始查看数据之前,是否有必要将其从回答中删除?请参阅我回答的更新:status实际上,任何非整数,如key handled。谢谢,我刚刚发现@response.delete_if{| k |[Status].include?k}测试通常不应该修改值。如果修改hash in place,则删除_。我确实喜欢你的答案,并确信它是有效的,尽管我不是三元运算符方面的专家,而且我在阅读你的答案时遇到困难,但我得到了部分答案,但不是全部。。请问有没有简化的方法?抱歉没有ternaries的最后一个变体从@response中选择了所有这些条目,既没有“Status”键,也没有所有必需的字段。一旦此数组为空,一切正常。感谢您帮助我了解每个值方法。从那以后,我尝试了每一把钥匙,并学会了这一点!哎呀!:
incompletes = @response.reduce([]) { |memo, kv| 
  (key_array - kv.last.keys).empty? ? memo : memo << kv.first 
}
expect(incompletes).to match_array([])
incompletes = @response.reject { |*kv| (key_array - kv.last.keys).empty? }
expect(incompletes).to match_array([]) 
incompletes = @response.reject { |k,v| 
# ⇓⇓ is k integer? ⇓⇓  or  ⇓⇓ are valid keys all presented? ⇓⇓
   k.to_i.to_s != k    ||      (key_array - v.keys).empty? 
}
expect(incompletes).to match_array([])