RSpec部分匹配嵌套哈希

时间:2016-10-30 03:33:21

标签: rspec

我有一个JSON结构,我希望匹配一个嵌套元素,而忽略其他数据。 JSON看起来像这样(最低限度):

{
  "employee": {
    "id": 1,
    "jobs_count": 0
  },
  "messages": [ "something" ]
}

这就是我现在正在使用的内容:

response_json = JSON.parse(response.body)
expect(response_json).to include("employee")
expect(response_json["employee"]).to include("jobs_count" => 0)

我想做的是:

expect(response_json).to include("employee" => { "jobs_count" => 0 })

不幸的是,include除了简单的顶级密钥检查(至少使用该语法)之外,还需要完全匹配。

有没有办法在忽略其余结构的情况下部分匹配嵌套哈希?

2 个答案:

答案 0 :(得分:14)

您可以为这些匹配器使用并嵌套hash_including方法。

使用您的示例,您可以将测试代码重写为:

expect(response_json).to include(hash_including({
  employee: hash_including(jobs_count: 0)
}))

(或如果response_json是单个对象,请将include替换为match

这在处理.with约束时也有效,例如:

expect(object).to receive(:method).with(hash_including(some: 'value'))

答案 1 :(得分:3)

对于rspec 3.6.0,这对我有效:

expect(subject).to match(a_hash_including({key: value}))