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 に答える