-
Notifications
You must be signed in to change notification settings - Fork 0
Générer une application rails avec RSpect et FactoryGirl
Normalement quand vous créez une application rails avec la commande:
rails new app
le système de test utilisé sera minitest, le générateur de données pour les test sera fait de fixtures en yaml.
Il existe cependant un duo beaucoup plus performant: RSpec pour le système de test, FactoryGirl pour la génération des données de test.
Tout d'abord on va générer une nouvelle application sans les fichiers de test, dans le --help
on peut voir:
-T, [--skip-test], [--no-skip-test] # Skip test files
donc la commande sera:
rails new app -T
Ensuite on ajoute les gems suivants dans le Gemfile:
group :development, :test do
.
.
.
gem 'rspec-rails', '~> 3.6.0'
gem 'factory_girl_rails', '~> 4.8.0'
gem 'capybara', '~> 2.14.4'
gem 'selenium-webdriver'
end
group :development, :test do
.
.
.
gem 'spring-commands-rspec'
end
capybara
offre une syntaxe très utile et claire pour tester des scénarios semblables à des actions que fera un utilisateur sur un navigateur, selenium-webdriver
est là pour le cas où certains pages utilisent javascript, il lancera alors un navigateur (pas très propre, il y a d'autres alternatives on verra après). Quand à spring-commands-rspec
il ne fait qu'implémenter la commande rspec
dans spring
, ça sera utile quand on rajoutera nos tests dans un guard
pour qu'ils soient exécutés automatiquement après chaque modification.
Ensuite un:
bundle
On initialise RSpec:
rails generate rspec:install
On génère bin/rspec
pour l'intégration à spring
avec:
bundle exec spring binstub rspec
Il serait bon de faire en sorte que l'affichage des résultats des tests soit sous le format d'une documentation, avec les warnings
au cas où, sans .rspec
on ajoute:
--format documentation
--warnings
On dit à rails qu'on veut générer des specs
(fichiers de test) pour nos modèles et contrôleurs, dans config/application.rb
on ajoute:
config.generators do |g|
g.test_framework :rspec, fixtures: false
end
Normalement avec l'ajout du gem factory_girl
les factories
seront automatiquement ajoutés lors de la création, voyons ce que ça pour la génération d'un modèle par exemple:
rails g model foo col1 col2
Running via Spring preloader in process 13273
invoke active_record
create db/migrate/20170728140108_create_foos.rb
create app/models/foo.rb
invoke rspec
create spec/models/foo_spec.rb
invoke factory_girl
create spec/factories/foos.rb
On voit qu'en plus de la migration et du fichier de modèle, on a un "spec" spec/models/foo_spec.rb
, c'est là que les tests du modèle seront effectués, et on a une factory
pour ce modèle dans spec/factories/foos.rb
.
Même mieux, on a scaffold pour le test dans spec/models/foo_spec.rb
require 'rails_helper'
RSpec.describe Foo, type: :model do
pending "add some examples to (or delete) #{__FILE__}"
end
et un pour le factory
dans spec/factories/foos.rb
:
FactoryGirl.define do
factory :foo do
col1 "MyString"
col2 "MyString"
end
end
Enfin, pour pouvoir appeler les méthodes de FG depuis les specs dans à chaque fois devoir écrire FactoryGirl
, ajouter cette ligne à spec/rails_helper.rb
:
config.include FactoryGirl::Syntax::Methods
La suite ici par exemple.