Scrierea de teste pentru codul aplicației este ceva ce toți programatorii ar trebui să fie familiarizați să facă, indiferent de limbajul sau framework-ul ales. RSpec este o suită de testare incredibilă și un DSL (Domain-Specific Language) construit în Ruby, care vă permite să scrieți teste unitare cu ușurință folosind un set de metode predefinite. Inițierea mea în scrierea de cod în Ruby a fost strâns legată de experiența de a rula religios RSpec pentru a testa ceea ce scrisesem; și astfel, când am început să învăț Rails, continuarea utilizării RSpec a făcut ca tranziția să fie mai naturală și mai transparentă. În mod implicit, Rails utilizează cadrul de testare MiniTest. Vom discuta despre cum să configurăm un nou proiect Rails pentru a utiliza RSpec și apoi vom explora utilizarea Capybara pentru a testa vizualizările noastre.
În primul rând, vom crea un nou proiect Rails prin rularea rails new NAME -T -B
, unde NUME este calea către directorul pentru proiectul care trebuie creat. Stegulețul -T
specifică faptul că Rails nu ar trebui să configureze niciun cadru de testare pentru noul nostru proiect, ceea ce este exact ceea ce ne dorim. Stegulețul -B
îi ordonă lui Rails să sară peste rularea bundle install
în acest moment. În continuare, trebuie să edităm fișierul nostru Gemfile pentru a include următoarele:
group :development, :test do
gem 'rspec-rails'
gem 'capybara'
end
Acest lucru adaugă atât RSpec cât și Capybara la mediile noastre de dezvoltare și testare. În acest moment, rulați bundle
pentru a instala gems și toate dependențele de care are nevoie proiectul. Îmi place să intru în rails console
în acest moment doar pentru a verifica dacă totul funcționează, iar dacă nu – mă întorc la fișierul meu Gemfile și rezolv orice problemă.
Acum că avem scheletul proiectului nostru, următorul pas este să ne montăm suita de testare. Pur și simplu rulați rails generate rspec:install
în acest punct pentru a crea directorul spec
și structura de fișiere necesară. Ultimul pas este de a spune testelor noastre să folosească Capybara. În spec/rails_helper.rb
, adăugați următoarele:
require 'capybara/rspec'
Acesta este tot pentru configurare! Înainte de a merge mai departe, haideți să validăm modificările pe care le-am făcut în proiectul nostru: git add . && git commit -m "initial commit"
. Să ne aruncăm în crearea unui controler și să facem niște teste!
În scopul testelor noastre, vom crea un formular simplu cu câteva intrări, apoi îi vom spune lui Capybara să completeze câteva date de probă și să trimită formularul. Nu ne vom preocupa de crearea unor modele complexe sau de persistența informațiilor într-o bază de date. Să-i spunem lui Rails să creeze un controler users
și să configureze niște rute pentru noi:
rails generate controller Users new --no-helper --no-assets --no-view-specs
Prin specificarea --no-helper --no-assets
îi spunem lui Rails să nu creeze niciun activ sau un helper pentru controlerul nostru. Opțiunea --no-view-specs
îi ordonă generatorului să nu creeze niciun test pentru vizualizări – vom vedea mai târziu cum să creăm testele pe care le dorim. Rails a creat o rută new
pentru noi, pe care o putem vedea în config/routes.rb
:
Rails.application.routes.draw do
get 'users/new'
end
Și în app/controllers/users_controller.rb
:
class UsersController < ApplicationController
def new
end
end
În cele din urmă, Rails a creat o vedere pentru noi în app/views/users/new.html.erb
. Haideți să modificăm această vizualizare pentru a crea un formular simplu:
<h1>User Login</h1>
<%= form_tag users_path do %>
<%= label_tag :name %>
<%= text_field_tag :name %>
<%= submit_tag "submit" %>
<% end %>
Trebuie să facem câteva lucruri pentru a termina de cablat acest lucru. În routes.rb
adăugați următoarele:
post 'users' => 'users#welcome'
De asemenea, trebuie să adăugăm o acțiune welcome
la users_controller.rb
:
def welcome
@user = params
render :welcome
end
Pasul final aici este crearea lui views/users/welcome.html.erb
și includerea unor elemente HTML și ERB pentru a afișa numele utilizatorului:
<h1><%= "Welcome, #{@user}!" %></h1>
Uf! Dacă rulăm rails server
și mergem la localhost:3000/users/new
în browserul nostru, ar trebui să fim întâmpinați de un formular care ne cere să introducem numele nostru. Când introducem numele nostru și apăsăm butonul de trimitere, ar trebui să fim redirecționați către o pagină care ne întâmpină cu un călduros bun venit. Toate acestea sunt bune și frumoase, dar faptul că trebuie să ne testăm codul în acest mod pentru a ne asigura că funcționează de fiecare dată când adăugăm un nou formular sau implementăm o nouă funcție va deveni în curând obositor. Din fericire, a fost creat un instrument care să testeze și să automatizeze acest proces pentru noi!
Aici intervine Capybara. Capybara este un framework care ne permite să testăm codul din vizualizările noastre prin completarea datelor din formulare, inspectarea conținutului paginii și trimiterea de cereri HTTP către browser. Să configurăm o specificație pentru a testa formularul nostru nou creat:
rails generate rspec:feature form
Acest lucru va genera fișierul spec/features/form_spec.rb
. În mod implicit, Capybara se așteaptă să găsească specs într-un director numit features
. Să edităm acest fișier pentru a adăuga un nou test, care va completa intrarea din câmpul de text name
și va apăsa 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
Așa este! Am creat cu succes primul nostru test în Rails folosind RSpec și Capybara. Dacă rulăm rspec --format documentation
, ar trebui să vedem că testul trece. Simțiți-vă liberi să experimentați – care sunt modalități de a face testul să eșueze? Există și alte teste pe care am putea să le creăm pentru acest exemplu? Am zgâriat doar suprafața aici – sperăm că acest lucru vă face să vă gândiți la modul în care puteți simplifica și automatiza procesul de testare a codului dvs. folosind aceste instrumente, și să vă obișnuiți să vă testați des codul.
Vizitați aici pentru codul prezentat în acest post.
.