【问题标题】:How to test with Rspec that a key exists inside a hash that contains an array of hashes如何使用 Rspec 测试包含散列数组的散列中是否存在键
【发布时间】:2016-01-27 13:27:40
【问题描述】:

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

 {"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


    【解决方案1】:

    这对我有用'rspec-rails', '~> 3.6'

    array_of_hashes = [
      {
        id: "1356786826",
        contact_name: 'John Doe'
      }
    ]
    
    expect(array_of_hashes).to include(have_key(:id))
    

    【讨论】:

      【解决方案2】:

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

      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】:

        如果您明确希望测试您的数组中映射到:data第一个哈希,这里是您的expects 给定您上面写的内容:

        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 中指出的那样,它具有更好的失败消息,如 cmets 中所示。

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

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

        【讨论】:

        • 所以我感觉好多了,因为我实际上已经尝试了其中的几个。当我尝试您列表中的第二个错误时,我收到以下错误。失败/错误:expect(subject.first.has_key?(:revenue)).to be_truthy NoMethodError: undefined method `has_key?'对于 #<0x007fec35b5c830>
        【解决方案4】:

        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
        

        【讨论】:

        • 我在尝试这个例子时得到以下结果--------失败/错误:expect(subject.first).to have_key(:revenue) expected ["data", [{ "product"=>"PRODUCTA", "orders"=>3, "ordered"=>13596, "revenue"=>600.0}, {"product"=>"PRODUCTB", "orders"=>1, "ordered "=>2568, "revenue"=>100.0}]] 回复has_key?
        • 您希望主题为subject { described_class.order_items_by_revenue["data"] },或者您想测试subject["data"].first。对不起。
        猜你喜欢
        • 2015-06-02
        • 2016-08-03
        • 2020-12-13
        • 2021-08-26
        • 1970-01-01
        • 2012-07-20
        • 2023-03-24
        • 2018-04-08
        • 2012-01-08
        相关资源
        最近更新 更多