Je suis nouveau dans les tests Rails applications Web et RSpec. Je travaille avec du code hérité et j'ai besoin d'ajouter des tests. Alors, quelle est la meilleure façon de tester les finders et les étendues nommées avec RSpec?
Je trouve dans Google quelques approches mais elles ne sont pas idéales. Par exemple:
http://paulsturgess.co.uk/articles/show/93-using-rspec-to-test-a-named_scope-in-Ruby-on-Rails
it "excludes users that are not active" do
@user = Factory(:user, :active => false)
User.active.should_not include(@user)
end
ou
http://h1labs.com/notebook/2008/8/21/testing-named-scope-with-rspec
it "should have a published named scope that returns ..." do
Post.published.proxy_options.should == {:conditions => {:published => true}}
end
Je trouve la meilleure approche (à mon humble avis) dans "Prescriptions d'essai ferroviaire":
should_match_find_method :active_only { :active == true }
où should_match_find_method
méthode d'assistance personnalisée
Le créateur de RSpec a récemment blogué qu'il pense Les validations sont des comportements, les associations sont des structures . En d'autres termes, il constate que les associations (et les étendues) ne doivent pas nécessairement être testées directement. Les tests pour ceux-ci découleront du comportement que vous souhaitez.
En d'autres termes, la sagesse actuelle est qu'il n'est pas nécessaire de tester directement chaque étendue, car vous couvrirez ces associations en testant le comportement de votre application.
De https://coderwall.com/p/hc8ofa/testing-Rails-model-default_scope-with-rspec
Exemple:
class Trip < ActiveRecord::Base
default_scope { order(departure: :asc) }
...
end
RSpec.describe Trip, type: :model do
it "applies a default scope to collections by departure ascending" do
expect(Trip.all.to_sql).to eq Trip.all.order(departure: :asc).to_sql
end
end
Le problème avec la première approche est qu'elle interroge réellement la base de données. C'est lent et inutile. Si cela ne vous dérange pas, vous pouvez utiliser la première approche en toute sécurité. La deuxième approche est rapide et claire, je le recommande donc.