Skip to content

Générer une application rails avec RSpect et FactoryGirl

ubugnu edited this page Feb 4, 2018 · 1 revision

Introduction

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.

Installation

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.