it-swarm.com.de

So testen Sie mit Rspec, ob ein Schlüssel in einem Hash vorhanden ist, der ein Array von Hashes enthält

Ich habe eine Model-Methode, die bei der Ausführung Folgendes zurückgibt.

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

Ich möchte testen, ob "Umsatz" im ersten Hash vorhanden ist, und dann testen, ob der Wert 600 entspricht.

subject { described_class.order_items_by_revenue }

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

Ich bin völlig verloren, wie ich das mit Rspec testen kann.

13
Mark Datoni

RSpec ermöglicht Ihnen die Verwendung des have_key predicate-Matchers, um das Vorhandensein eines Schlüssels über has_key? zu bestätigen, wie dies z.

subject { described_class.order_items_by_revenue }

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

Wenn Sie explizit only the first hash in Ihrem :data zugeordneten Array testen möchten, geben Sie hier Ihre expects an, die Sie oben geschrieben haben:

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

Alternativ können Sie für die zweite Erwartung expect(data).to have_key(:revenue) verwenden, wie Chris Heald in seine Antwort , die eine viel schönere Fehlermeldung aufweist, wie in den Kommentaren gezeigt wird).

  1. Der erste "Erwartungstest", ob der Betreff den ersten Hash hat. (Sie können alternativ testen, ob das Array empty? ist.)
  2. Die nächste Erwartung ist zu testen, ob erster Hash den Schlüssel :revenue hat.
  3. Die letzte Erwartung prüft, ob der Wert erster Hash:revenue gleich 600 ist

Sie sollten lesen Sie sich RSpec durch, es ist ein sehr leistungsfähiges und nützliches Test-Framework.

4
wspurgin

Dieses Problem kann durch Testen jedes Hashes durch einen mit einem geeigneten Werttyp vorhandenen Schlüssel gelöst werden. Zum Beispiel:

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