Tester votre app Rails avec Shoulda-matchers, Factory_bot…

Un développeur effectue des séries de tests en cours de développement. Ainsi on privilégie la qualité et on évite des dysfonctionnements pour les utilisateurs finaux.

Nous allons voir par cet exemple une approche de test unitaire. Nous utilisons l’outil Rspec pour réaliser le test unitaire dans l’environnement de développement Ruby. Factory_bot qui est à l’origine connu sous le nom de Factory_girl va nous servir pour créer des données de tests. Enfin, Shoulda-matchers va nous simplifier les tests à réaliser en une ligne au lieu de plusieurs avec Rspec.

Tester votre app rails : Préparation

Créez un nouveau projet avec le nom de votre choix, ici “Tests_Rspec_avec_Shoulda-matchers” en précisant l’utilisation d’une base de données PostgreSQL. Le model va nous servir pour la correspondance de notre table User associé à la base de données.

$ rails new tests_Rspec_avec_Shoulda-matchers -d postgresql
$ cd tests_Rspec_avec_Shoulda-matchers
$ rails generate model User first_name:string last_name:string email:string password:string
$ git init
$ git add .
$ git commit -m "First commit"
$ hub create
$ git push origin master
$ rails db:create && rails db:migrate

Accédez au répertoire tests_Rspec_avec_Shoulda-matchers depuis votre éditeur de codes. Dans mon cas j’y accède depuis sublime text 3.

Tester votre app rails : Installation de factory bot, shoulda-matchers, rspec et ffaker

Ajoutez les Gem factory_bot_rails et rpec-rails à votre Gemfile.

# Gemfile
# [...]
group :test do
 gem 'shoulda-matchers'
end

group :development, :test do
 gem 'factory_bot_rails'
 gem 'ffaker'
 gem 'rspec-rails', '~> 3.8'
end 

Installez les Gems depuis votre invite de commande et générez le dossier spec

$ bundle install
$ rails generate rspec:install

La commande rails generate rspec:install va générer les fichiers de configuration suivant :

.rspec

spec/spec_helper.rb

spec/rails_helper.rb

Créez l’arborescence suivante avec un dossier factories, models et support.

rspec arborescence

Depuis votre éditeur de code, recherchez CTRL+P le dossier .rspec et ajoutez la ligne –format documentation

A la fin d’exécution de vos tests, vous aurez un affichage plus clair que ce qui suit !

something
does something that passes
does something that fails (FAILED - 1)
does something that is pending (PENDING: Not Yet Implemented)
# spec/.rspec
--require spec_helper
--format documentation 

Ajoutez la config dans rails_helper.rb pour utiliser les tests de shoulda-matchers.

# spec/rails_helper.rb
# [...]
Shoulda::Matchers.configure do |config|
 config.integrate do |with|
 # Choose a test framework:
 with.test_framework :rspec
 # Or, choose the following (which implies all of the above):
 with.library :rails
 end
end
# [...] 

Créez le fichier factory_bot.rb depuis le dossier support avec le code ci-dessous :

# spec/support/factory_bot.rb
require 'factory_bot_rails'
RSpec.configure do |config|
 config.include FactoryBot::Syntax::Methods
end 

Ajoutez dans le fichier rails_helper.rb la ligne suivante pour pouvoir utiliser factory_bot.

# spec/rails_helper.rb
# [...]
require 'support/factory_bot'
# [...] 

Tester votre app rails : Factory bot et RSpec pour tester notre modèle user

Ajoutez les critères de validation pour notre modèle User

# app/models/user.rb
class User < ApplicationRecord
 validates_presence_of :first_name, :last_name
 validates :email, presence: true, uniqueness: true
 validates :password, presence: true, length: { minimum: 6 }
end 

Ajoutez les lignes suivantes dans le fichier user.rb du dossier factory.

ffaker va générer pour nous un prénom et un nom en français. Les résultats seront interpolés pour construire l’e-mail

# spec/factories/user.rb
require 'ffaker' FactoryBot.define do
 factory :user do
  first_name {FFaker::Name.first_name}
  last_name {FFaker::Name.last_name}
email { "#{first_name}.#{last_name}@exemple.com"}
  password {'123456'} 
 end
end

created_users = FactoryBot.create_list(:user, 10) 

Créez le fichier user_spec.rb et ajoutez les tests dans le dossier models.

# spec/models/user_spec.rb
require "rails_helper"

RSpec.describe User, type: :model do
 context 'validation tests' do
 let(:user) {create(:user)}
  it 'ensures first_name presence' do
   should validate_presence_of(:first_name) 
  end

  it 'ensures last_name presence' do
   should validate_presence_of(:last_name) 
  end

  it 'ensures email is unique' do
   should validate_uniqueness_of(:email)
  end

  it 'ensures password length of 6 char' do 
   should validate_length_of(:password).is_at_least(6) 
  end

  it 'should save successfully' do 
   expect(user.save).to eq (true) 
  end
 end
end 

Lancez vos tests à l’aide de la commande rspec depuis votre invite de commande

$ rspec spec/models/user_spec.rb

Sources

https://github.com/thoughtbot/factory_bot

https://github.com/thoughtbot/shoulda-matchers

https://github.com/ffaker/ffaker

https://github.com/rspec/rspec-rails

signature Pierre-Christophe

Aucun commentaires

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.