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.
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
Si vous voulez explicitement tester seulement le premier hash dans votre tableau mappé sur :data
, voici votre expect
s é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.
empty?
):revenue
:revenue
est égale à 600Vous devriez lisez sur RSpec , c'est un framework de test très puissant et utile.
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)})