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

Ruby 如何使用Rspec测试密钥是否存在于包含哈希数组的哈希中,ruby,hash,rspec,Ruby,Hash,Rspec,我有一个Model方法,它在执行时返回以下内容 {"data" => [ {"product" => "PRODUCTA", "orders" => 3, "ordered" => 6, "revenue" => 600.0}, {"product" => "PRODUCTB", "orders" => 1, "ordered" => 5, "revenue" => 100.0}]} 我想测试以确保第一个散列中的“revenue”存在

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

 {"data" => [
 {"product" => "PRODUCTA", "orders" => 3, "ordered" => 6, "revenue" => 600.0},
 {"product" => "PRODUCTB", "orders" => 1, "ordered" => 5, "revenue" => 100.0}]}
我想测试以确保第一个散列中的“revenue”存在,然后测试该值是否等于600

subject { described_class.order_items_by_revenue }

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

我完全不知道如何用Rspec测试这个问题。

如果您明确地只想测试映射到
: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.),如Chris Heald所指出的那样,使用_key(:revenue)
,其中有一个更好的失败消息,如注释中所示

  • 如果主题具有第一个散列,则第一个“期望”测试。(您可以交替测试数组是否为空?)
  • 下一个期望是测试第一个散列是否具有键
    :revenue
  • 最后一个期望测试第一个哈希值
    :revenue
    值是否等于600

  • 您应该知道,它是一个非常强大和有用的测试框架。

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

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

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

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

    这在
    'rspec-rails'、“~>3.6”中对我很有效

    散列数组=[
    {
    id:“1356786826”,
    联系人姓名:“John Doe”
    }
    ]
    expect(数组\的\散列)。包含(具有\键(:id))
    
    所以我感觉好了一点,因为我实际上已经尝试了其中的两种。当我尝试您列表中的第二个时,出现以下错误。失败/错误:expect(subject.first.has_key?(:revenue)).to-to-truty NoMethodError:undefined方法'has_key?。#看起来它应该是
    subject[:data]。首先
    当我尝试这个例子时,我得到了以下信息------失败/错误:expect(subject.first)。让[u key(:revenue)expected[“data”,[{“product”=>“PRODUCTA”,“orders”=>3,“ordered”=>13596,“revenue”=>600.0},{“product”=>“PRODUCTB”,“orders”=>1,“ordered”=>2568,“revenue”=>100.0}]]响应
    has_key?
    您希望主题是
    主题{描述类。订单项目由收入[“数据”}
    ,或者您想测试
    主题[“数据”]。首先
    。对不起。