Foto di Karen Lau su Unsplash

Scrivere test per il codice delle applicazioni è qualcosa che tutti i programmatori dovrebbero avere familiarità nel fare, indipendentemente dal linguaggio o framework scelto. RSpec è un’incredibile suite di test e DSL (Domain-Specific Language) costruito in Ruby, che permette di scrivere test unitari con facilità usando un set di metodi predefiniti. La mia introduzione alla scrittura di codice in Ruby era strettamente legata all’esperienza di eseguire religiosamente RSpec per testare ciò che avevo scritto; e così quando ho iniziato ad imparare Rails, continuare ad usare RSpec ha reso la transizione più naturale e senza problemi. Per default, Rails usa il framework di test MiniTest. Discuteremo come impostare un nuovo progetto Rails per usare RSpec, e poi esploreremo l’uso di Capybara per testare le nostre viste.

Primo, creeremo un nuovo progetto Rails eseguendo rails new NAME -T -B, dove NAME è il percorso della directory del progetto che dovrebbe essere creato. Il flag -T specifica che Rails non dovrebbe impostare alcun framework di test per il nostro nuovo progetto, che è esattamente ciò che vogliamo. Il flag -B indica a Rails di saltare l’esecuzione di bundle install a questo punto. Successivamente, dobbiamo modificare il nostro Gemfile per includere quanto segue:

group :development, :test do
gem 'rspec-rails'
gem 'capybara'
end

Questo aggiunge sia RSpec che Capybara ai nostri ambienti di sviluppo e di test. A questo punto, eseguite bundle per installare le gemme e qualsiasi dipendenza di cui il progetto ha bisogno. Mi piace entrare in rails console a questo punto solo per controllare che tutto funzioni, e se non funziona – torno al mio Gemfile e correggo qualsiasi problema.

Ora che abbiamo il nostro scheletro di progetto a posto, il prossimo passo è quello di preparare la nostra suite di test. A questo punto basta eseguire rails generate rspec:install per creare la directory spec e la struttura di file necessaria. L’ultimo passo è dire ai nostri test di usare Capybara. In spec/rails_helper.rb, aggiungete quanto segue:

require 'capybara/rspec'

Questo è tutto per la configurazione! Prima di andare avanti, facciamo il commit dei cambiamenti che abbiamo fatto al nostro progetto: git add . && git commit -m "initial commit". Immergiamoci nella creazione di un controller e facciamo qualche test!

Foto di Max Nelson su Unsplash

Per i nostri scopi di test, creeremo un semplice modulo con alcuni input, e poi diremo a Capybara di compilare alcuni dati di esempio e inviare il modulo. Non ci preoccuperemo di creare alcun modello complesso o di persistere le informazioni in un database. Diciamo a Rails di creare un users controller e di impostare un po’ di routing per noi:

rails generate controller Users new --no-helper --no-assets --no-view-specs

Specificando --no-helper --no-assets stiamo dicendo a Rails di non creare alcuna risorsa o un helper per il nostro controller. L’opzione --no-view-specs indica al generatore di non creare alcun test per le viste – vedremo più avanti come creare i test che vogliamo. Rails ha creato una rotta new per noi, che possiamo vedere in config/routes.rb:

Rails.application.routes.draw do
get 'users/new'
end

E in app/controllers/users_controller.rb:

class UsersController < ApplicationController
def new
end
end

Infine, Rails ha creato una vista per noi in app/views/users/new.html.erb. Modifichiamo questa vista per creare un semplice modulo:

<h1>User Login</h1>
<%= form_tag users_path do %>
<%= label_tag :name %>
<%= text_field_tag :name %>
<%= submit_tag "submit" %>
<% end %>

Dobbiamo fare un paio di cose per finire il cablaggio. In routes.rb aggiungiamo quanto segue:

post 'users' => 'users#welcome'

Abbiamo anche bisogno di aggiungere un’azione welcome a users_controller.rb:

def welcome
@user = params
render :welcome
end

Il passo finale qui è creare views/users/welcome.html.erb e includere un po’ di HTML e ERB per visualizzare il nome dell’utente:

<h1><%= "Welcome, #{@user}!" %></h1>

Ecco! Se eseguiamo rails server e andiamo a localhost:3000/users/new nel nostro browser, dovremmo essere accolti da un modulo che ci chiede di inserire il nostro nome. Quando inseriamo il nostro nome e premiamo il pulsante di invio, dovremmo essere reindirizzati a una pagina che ci saluta con un caldo benvenuto. Tutto questo va bene, ma dover testare il nostro codice in questo modo per assicurarsi che funzioni ogni volta che aggiungiamo un nuovo modulo o implementiamo una nuova funzionalità diventerà presto noioso. Fortunatamente, è stato creato uno strumento per testare e automatizzare questo processo per noi!

E’ qui che entra in gioco Capybara. Capybara è un framework che ci permette di testare il codice nelle nostre viste compilando i dati del modulo, ispezionando il contenuto della pagina e inviando richieste HTTP al browser. Impostiamo una specifica per testare il nostro modulo appena creato:

rails generate rspec:feature form

Questo genererà il file spec/features/form_spec.rb. Per default, Capybara si aspetta di trovare le specifiche in una directory chiamata features. Modifichiamo questo file per aggiungere un nuovo test, che riempirà l’input del campo di testo name e premerà submit:

require 'rails_helper'RSpec.feature "Forms", type: :feature do
it 'can enter a name and receive a greeting' do
visit 'users/new'
fill_in :name, with: "Capybara"
click_on 'submit'
expect(page).to have_content "Welcome, Capybara!"
end
end

Ecco fatto! Abbiamo creato con successo il nostro primo test in Rails usando RSpec e Capybara. Se eseguiamo rspec --format documentation, dovremmo vedere che il test passa. Sentitevi liberi di sperimentare – quali sono i modi per far fallire il test? Ci sono altri test che potremmo creare per questo esempio? Abbiamo solo grattato la superficie qui – speriamo che questo vi faccia pensare a come potete semplificare e automatizzare il processo di test del vostro codice usando questi strumenti, e prendere l’abitudine di testare spesso il vostro codice.

Visitate qui per il codice presentato in questo post.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.