RSpec 与嵌套哈希的部分匹配

问题描述 投票:0回答:2

我有一个 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
需要精确匹配除简单的顶级密钥检查之外的任何内容(至少使用该语法)。

有没有办法部分匹配嵌套哈希,同时忽略结构的其余部分?

rspec
2个回答
46
投票

您可以为这些匹配器使用和嵌套

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'))

42
投票

使用 rspec 3.6.0,这对我有用:

expect(subject).to match(a_hash_including(key: value))
© www.soinside.com 2019 - 2024. All rights reserved.