问题 如何使用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进行测试。


2466
2017-10-27 22:40


起源



答案:


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

11
2017-10-27 22:57



当我尝试这个例子时,我得到以下结果--------失败/错误:期望(subject.first).to have_key(:revenue)expected [“data”,[{“product”=>“PRODUCTA” ,“orders”=> 3,“ordered”=> 13596,“revenue”=> 600.0},{“product”=>“PRODUCTB”,“orders”=> 1,“ordered”=> 2568,“收入” => 100.0}]]回应 has_key? - Mark Datoni
你想要的主题 subject { described_class.order_items_by_revenue["data"] },或者你想测试 subject["data"].first。抱歉。 - Chris Heald


答案:


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

11
2017-10-27 22:57



当我尝试这个例子时,我得到以下结果--------失败/错误:期望(subject.first).to have_key(:revenue)expected [“data”,[{“product”=>“PRODUCTA” ,“orders”=> 3,“ordered”=> 13596,“revenue”=> 600.0},{“product”=>“PRODUCTB”,“orders”=> 1,“ordered”=> 2568,“收入” => 100.0}]]回应 has_key? - Mark Datoni
你想要的主题 subject { described_class.order_items_by_revenue["data"] },或者你想测试 subject["data"].first。抱歉。 - Chris Heald


如果你明确想要测试 只要 该 第一个哈希 在您的数组映射到 :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. 最后的期望测试是否 第一个哈希  :revenue 值等于600

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


4
2017-10-27 22:49



所以我觉得好一点,因为我实际上尝试了其中的几个。当我在列表中尝试第二个错误时,我收到以下错误。失败/错误:期望(subject.first.has_key?(:revenue))。to be_truthy NoMethodError:undefined method`has_key?'对于#<Array:0x007fec35b5c830> - Mark Datoni
看起来应该是这样 subject[:data].first - wspurgin


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

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

0
2018-04-12 10:24