将密钥数组与预定义数组(Ruby)进行比较
我想将JSON响应中返回的所有结果的键与预定义的键数组进行比较 所以我有这套钥匙将密钥数组与预定义数组(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_数组中设置了键
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([])