如何使用 Rspec 测试密钥是否存在于包含散列数组的散列中

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

我有一个模型方法,执行时返回以下内容。

 {"data" => [
 {"product" => "PRODUCTA", "orders" => 3, "ordered" => 6, "revenue" => 600.0},
 {"product" => "PRODUCTB", "orders" => 1, "ordered" => 5, "revenue" => 100.0}]}

我想测试以确保第一个哈希中的“收入”存在,然后测试该值是否等于 600。

subject { described_class.order_items_by_revenue }

it "includes revenue key" do
  expect(subject).to include(:revenue)
end

我完全不知道如何使用 Rspec 来测试它。

ruby hash rspec
4个回答
61
投票

RSpec 允许您使用 have_key 谓词匹配器通过

has_key?
验证键是否存在,如下所示:

subject { described_class.order_items_by_revenue }

it "includes revenue key" do
  expect(subject.first).to have_key(:revenue)
end

9
投票

可以通过按具有适当类型值的键测试每个哈希来解决此问题。例如:

describe 'GetCatsService' do
  subject { [{ name: 'Felix', age: 25 }, { name: 'Garfield', age: 40 }] }

  it { is_expected.to include(include(name: a_kind_of(String), age: a_kind_of(Integer)))}
end

# GetCatsService
#  should include (include {:name => (a kind of String), :age => (a kind of Integer)})

7
投票

如果您明确想要测试only映射到:data的数组中的

第一个哈希
,那么根据您上面所写的内容,这是您的
expect

data = subject[:data].first
expect(data).not_to be_nil
expect(data.has_key?(:revenue)).to be_truthy
expect(data[:revenue]).to eq 600

或者,对于第二个期望,您可以使用

expect(data).to have_key(:revenue)
,正如 Chris Heald 在 他的回答 中指出的那样,它有一个更好的失败消息,如评论中所示。

  1. 第一个“期望”测试主题是否具有第一个哈希值。 (您也可以测试数组是否为
    empty?
  2. 下一个期望是测试第一个哈希是否有密钥
    :revenue
  3. 最后一个期望测试 first hash
    :revenue
    值是否等于 600

您应该阅读 RSpec,它是一个非常强大且有用的测试框架。


2
投票

这对我有用

'rspec-rails', '~> 3.6'

array_of_hashes = [
  {
    id: "1356786826",
    contact_name: 'John Doe'
  }
]

expect(array_of_hashes).to include(have_key(:id))
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.