web-dev-qa-db-fra.com

Rails: test des étendues nommées avec RSpec

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 }

should_match_find_method méthode d'assistance personnalisée

33
andrykonchin

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.

31
Joost Baaij

De https://coderwall.com/p/hc8ofa/testing-Rails-model-default_scope-with-rspec

  • aucune requête de base de données
  • pas besoin de représenter la requête dans une structure

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
4
hakunin

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.

0
Jan Minárik