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

时间:2015-10-27 22:40:53

标签: ruby hash rspec

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

 {"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进行测试。

4 个答案:

答案 0 :(得分:18)

RSpec允许您使用have_key谓词匹配器通过subject { described_class.order_items_by_revenue } it "includes revenue key" do expect(subject.first).to have_key(:revenue) end 验证密钥的存在,如下所示:

.hitbox {
  width: 25%; /* of page */
}

@media (min-width: 702px) and (max-width: 800px) {
  .hitbox .tablewrapper {
    font-size: 9px;
  }
}
@media (min-width: 800px) and (max-width: 840px) {
  .hitbox .tablewrapper {
    font-size: 10px;
  }
}
@media (min-width: 840px) and (max-width: 915px) {
  .hitbox .tablewrapper {
    font-size: 11px;
  }
}

答案 1 :(得分:4)

如果您明确要测试映射到: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在his answer中指出的,其中有一个更好的失败消息,如评论中所示。

  1. 如果主题具有第一个哈希,则进行第一次“期望”测试。 (您可以交替测试数组是否为empty?
  2. 下一个期望是测试第一个哈希是否有密钥:revenue
  3. 最后一次期望测试第一个散列 :revenue值是否等于600
  4. 你应该read up on RSpec,它是一个非常强大且有用的测试框架。

答案 2 :(得分:1)

可以通过使用适当类型的值存在的密钥测试每个哈希来解决此问题。例如:

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

答案 3 :(得分:0)

这在'rspec-rails', '~> 3.6'

中对我有用
array_of_hashes = [
  {
    id: "1356786826",
    contact_name: 'John Doe'
  }
]

expect(array_of_hashes).to include(have_key(:id))