Une Feature est un ensemble de Scénarios.
Une Feature peut avoir un Background.
Un Scénario est un ensemble d’étape, devant se déroulé tel qu’il sera défini.
Un Background est un ensemble d’éléments, communs à tous les Scénario de la Feature.
Exemple de Feature (/features/news_items/news_admin.feature):
Feature:
An admin should be able
To administer the news items
Background:
Given I am an admin
And there is 1 news category in the database
And there is 1 news item in the database
When I go to the show news category page
Scenario:
Then I should see the news item title
And I should see a link to "Edit"
And I should see a link to "Delete"
Scenario: Adding
Given I should see a link to "New"
When I go to the new news item page
When I fill in the news item fields with valid info
And I press "SAVE"
And I should see the news item title
And I should see a link to "Edit"
And I should see a link to "Delete"
Une Feature possède tout d’abord un énoncé, qui sera affiché lors de l’exécution des tests.
Un Background et les Scenarios peuvent avoir un Titre (ici Adding pour le 2ème Scenario).
La syntaxe utilisée dans la description des steps (chaque étape d’un Scenario ou Background) ne peut pas être n’importe quoi, cette syntaxe est définie ailleurs.
Nous allons tout d’abord retrouver les steps propre à notre modèle (ici news_item).
Ces steps sont à trouver/écrire dans : /features/step_definitions/nom_du_model_steps.rb
Donc dans notre exemple /features/step_definitions/news_items_steps.rb
Prenons un extrait de ce fichier :
When /^I fill in the news item fields with valid info$/ do
step %{I fill in "news_item_title_fr" with "Titre"}
step %{I fill in "news_item_body_fr" with "My content"}
step %{I fill in "news_item_title_en" with "Title"}
step %{I fill in "news_item_body_en" with "My content"}
end
Cette exemple (doit) ressembler à ce que nous avons dans notre Feature. Donc si on regarde bien, nous avons la ligne suivante dans le Scenario Adding :
When I fill in the news item fields with valid info
Cela veut donc dire, que quand dans notre Feature, il va se trouver devant cette ligne, il va chercher ce qu’elle fait, dans notre step_definitions.
Ici en l’occurrence, il remplit les champs du formulaire avec des valeurs définis dans le fichier.
Les noms de champs que nous voyons ici (news_item_title_fr par ex) correspond exactement à ce que donne le formulaire de la vue, car l’execution d’une Feature correspond en fait à la navigation dans le site, on lui dit « va sur cette page » « clique sur ce lien » « remplit ce champs ».
Voici maintenant le fichier de step_definitions des news_item en entier :
Then /^I should see the (?:news|news item) title$/ do
step %{I should see "#{NewsItem.last.title}"}
end
Then /^I should see the (?:news|news item) body$/ do
step %{I should see "#{@news_item.body}"}
end
When /^I fill in the news item fields with valid info$/ do
step %{I fill in "news_item_title_fr" with "Titre"}
step %{I fill in "news_item_body_fr" with "My content"}
step %{I fill in "news_item_title_en" with "Title"}
step %{I fill in "news_item_body_en" with "My content"}
end
Then /^the news item should be private$/ do
NewsItem.last.public.should be_false
end
Then /^I should not see a link to new news item$/ do
# This always sees a link to "New" because there's so many links to News etc on the page
# step %{I should not see a link to "New"}
end
Then /^I should see a link to new news item$/ do
step %{I should see a link to "New"}
end
Par défaut, ce fichier est vide, et c’est au développeur de l’écrire, donc de faire correspondre les étapes de ses Scenario, à une syntaxe compréhensible par le programme.
Comme on peut le voir, tout n’est pas défini (certain éléments présent dans notre Feature ne sont pas défini dans ce fichier steps_definition).
Cela s’explique car certaines étapes sont prédéfini dans d’autres fichiers tels que :
/features/step_definitions/web_steps.rb
/features/step_definitions/factory_magic_steps.rb
/features/step_definitions/only_n_steps.rb
Le fichier web_steps est un fichier fourni par Cucumber, il ne devrait donc pas y avoir à faire des modifications.
Les 2 autres fichiers sont a compléter également.
Pour finir, il faut savoir que pendant les tests, on ne travail pas réellement sur la base de données, mais sur un modèle qui s’appel FactoryGirl et qui permet de créer nos objets.
Les fichiers FactoryGirl sont stockés dans /spec/factories.
Dans notre cas : /spec/factories/news_item_factories.rb :
FactoryGirl.define do
factory :news_item do
title "My news"
body "My Body"
association :user
release_at { Date.today - 1.week }
valid_until { Date.today + 1.month }
news_category
public true
publish true
factory :private_news_item do
public false
end
end
end
La définition de ce fichier doit correspondre au vrai modèle, et ici on attribue également des valeurs par défaut, dans le cas où comme pour notre exemple, aucunes valeurs ne sont précisés.