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

Mar*_*oni 19 ruby hash rspec

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

 {"data" => [
 {"product" => "PRODUCTA", "orders" => 3, "ordered" => 6, "revenue" => 600.0},
 {"product" => "PRODUCTB", "orders" => 1, "ordered" => 5, "revenue" => 100.0}]}
Run Code Online (Sandbox Code Playgroud)

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

subject { described_class.order_items_by_revenue }

it "includes revenue key" do
  expect(subject).to include(:revenue)
end
Run Code Online (Sandbox Code Playgroud)

我完全迷失了如何使用Rspec进行测试.

Chr*_*ald 24

RSpec允许您使用has_key谓词匹配器来验证密钥的存在has_key?,如下所示:

subject { described_class.order_items_by_revenue }

it "includes revenue key" do
  expect(subject.first).to have_key(:revenue)
end
Run Code Online (Sandbox Code Playgroud)


Pur*_*lex 6

这个问题可以通过用适当类型的值存在的键来测试每个散列来解决。例如:

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)})
Run Code Online (Sandbox Code Playgroud)


wsp*_*gin 5

如果你明确要测试第一散列阵列中映射到: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
Run Code Online (Sandbox Code Playgroud)

另外,对于第二个期望,您可以使用expect(data).to have_key(:revenue)Chris Heald在他的回答中指出的那样,它具有更好的失败消息,如注释中所示。

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

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