0

所以我的代码是这样返回 json 的:

    "offenses": [
    {
    "name": "Speeding",
    "penalties": [
    {
    "name": "Ticket",
    "severity": "Medium"
    }

}
]

我有以下胖女孩:

FactoryGirl.define do
  factory :person_offense_penalty do
    person_offense
    name 'Ticket'
    severity 'Medium'
  end
end



FactoryGirl.define do
  factory :person_offense do
    name 'Speeding'
    person
  end
end

这是我对响应的测试,它工作正常

  person_offenses = person.person_offenses
  expect(response_body['offenses'].size).to eq(person_offenses.size)



   person_offenses.each_with_index do |offense, offense_index|
        expect(response_body['offenses'][offense_index]['name']).to eq(offense.name)
        offense.person_offense_penaltys.each_with_index do |penalty, penalty_index|
          expect(response_body['offenses'][offense_index]['penaltys'][penalty_index]['name']).to eq(penalty.name)
          expect(response_body['offenses'][offense_index]['penaltys'][penalty_index]['severity']).to eq(penalty.severity)
        end
      end

我需要编写另一个测试来确保攻击名称按升序排序。有人可以帮我吗

4

1 回答 1

1

首先,让我们将您的 JSON 转换为有效字符串:

[1] pry(main)> x = "{\"offenses\": [{ \"name\": \"Speeding\", \"penalties\": [ { \"name\": \"Ticket\", \"severity\": \"Medium\" } ] }] }"

现在我们可以解析它ActiveSupport::JSON.decode

[2] pry(main)> offenses = ActiveSupport::JSON.decode(x)["offenses"]
=> [{"name"=>"Speeding", "penalties"=>[{"name"=>"Ticket", "severity"=>"Medium"}]}]

您可以使用以下命令获取攻击名称列表map

[3] pry(main)> names = offenses.map { |o| o["name"] }
=> ["Speeding"]

现在您可以简单地sort命名并进行比较

expect(names).to eq(names.sort)

如果原始 JSON 的每个都按其属性"offense"排序,这将通过"name"

于 2013-03-28T18:11:43.657 回答