2015-10-27 12 views
8

Mam metodę modelu, która zwraca następujące po wykonaniu.Jak przetestować za pomocą Rspec, czy istnieje klucz wewnątrz hasza zawierającego tablicę skrótów

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

Chciałbym przetestować, aby upewnić się, że „dochody” w pierwszym hash jest tam, a następnie sprawdzić, czy wartość jest równa 600.

subject { described_class.order_items_by_revenue } 

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

jestem całkowicie utracone, w jaki sposób przetestuj to z Rspec.

Odpowiedz

1

Jeśli wyraźnie chcą przetestować tylkopierwszy hash w macierzy odwzorowane na :data, tu są twoje expect s podane co napisałeś powyżej:

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

Alternatywnie, na drugiej oczekiwania, można użyć expect(data).to have_key(:revenue), jak Chris Heald wskazał w his answer, który ma znacznie ładniejszy komunikat o błędzie niż w komentarzach.

  1. Pierwszy "oczekiwanie" test, jeśli obiekt ma pierwszy hash. (Można na przemian sprawdzić, czy tablica jest empty?)
  2. Kolejnym oczekiwaniem testuje jeśli pierwszy hash ma klucz :revenue
  3. W ostatnich testów oczekiwanie jeśli pierwszy hash:revenue wartość jest równa 600

Powinieneś read up on RSpec, to bardzo potężny i użyteczny framework testowy.

+0

więc czuję się trochę lepiej, bo rzeczywiście próbował kilka z nich. Otrzymuję następujący błąd, gdy próbuję drugi na liście. Błąd: oczekiwanie (subject.first.has_key? dla #

+0

Wygląda na to powinno być przedmiotem '[: dane] .first' – wspurgin

5

RSpec pozwala użyć dopasowywania have_key źródłowe do wykrycia obecności klucza poprzez has_key?, tak:

subject { described_class.order_items_by_revenue } 

it "includes revenue key" do 
    expect(subject.first).to have_key(:revenue) 
end 
+0

otrzymuję następujący gdy próbuję ten przykład -------- Failure/Error: oczekuj (subject.first) .to have_key (: revenue) expected ["dane", [{"produkt" => "PRODUCTA", "zamówienia" => 3, "zamówione" => 13596, "przychody" => 600,0} , {"product" => "PRODUCTB", "zamówienia" => 1, "zamówione" => 2568, "dochody" => 100,0}]] aby odpowiedzieć na 'has_key?' –

+0

Chcesz poddać się describe_class.order_items_by_revenue ["data"]} ', lub chcesz przetestować' subject ["data"]. first'. Przepraszam. –

Powiązane problemy