web-dev-qa-db-fra.com

Comment tester avec Rspec qu'une clé existe dans un hachage contenant un tableau de hachages

J'ai une méthode Model qui retourne ce qui suit lorsqu'elle est exécutée.

 {"data" => [
 {"product" => "PRODUCTA", "orders" => 3, "ordered" => 6, "revenue" => 600.0},
 {"product" => "PRODUCTB", "orders" => 1, "ordered" => 5, "revenue" => 100.0}]}

Je voudrais tester pour m'assurer que le "revenu" dans le premier hachage est là et ensuite vérifier que la valeur est égale à 600.

subject { described_class.order_items_by_revenue }

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

Je suis complètement perdu sur la façon de tester cela avec Rspec.

13
Mark Datoni

RSpec vous permet d’utiliser le prédicateur prédicat have_key pour valider la présence d’une clé via has_key?, comme suit:

subject { described_class.order_items_by_revenue }

it "includes revenue key" do
  expect(subject.first).to have_key(:revenue)
end
13
Chris Heald

Si vous voulez explicitement tester seulement le premier hash dans votre tableau mappé sur :data, voici votre expects étant donné ce que vous avez écrit ci-dessus:

data = subject[:data].first
expect(data).not_to be_nil
expect(data.has_key?(:revenue)).to be_truthy
expect(data[:revenue]).to eq 600

Alternativement, pour la deuxième attente, vous pouvez utiliser expect(data).to have_key(:revenue) comme Chris Heald l'a souligné dans sa réponse qui contient un message d'échec beaucoup plus agréable, comme indiqué dans les commentaires.

  1. Le premier test "d'attente" si le sujet possède le premier hachage. (Vous pouvez également tester si le tableau est empty?)
  2. La prochaine attente teste si le premier hachage a la clé :revenue
  3. La dernière attente teste si la valeur première hachage:revenue est égale à 600

Vous devriez lisez sur RSpec , c'est un framework de test très puissant et utile.

4
wspurgin

Ce problème peut être résolu en testant chaque hachage par clé existante avec le type de valeur approprié. Par exemple:

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)})
1
Alex P