At skrive tests til programkode er noget, som alle programmører bør være fortrolige med at udføre, uanset hvilket sprog eller hvilken ramme de vælger. RSpec er en utrolig testsuite og DSL (Domain-Specific Language) bygget i Ruby, som giver dig mulighed for at skrive enhedstests med lethed ved hjælp af et sæt foruddefinerede metoder. Min introduktion til at skrive kode i Ruby var tæt forbundet med oplevelsen af religiøst at køre RSpec for at teste det, jeg havde skrevet; og da jeg begyndte at lære Rails, var det derfor en mere naturlig og problemfri overgang at fortsætte med at bruge RSpec. Som standard bruger Rails testrammen MiniTest. Vi vil diskutere, hvordan man opsætter et nyt Rails-projekt til at bruge RSpec, og derefter udforske brugen af Capybara til at teste vores visninger.
Først opretter vi et nyt Rails-projekt ved at køre rails new NAME -T -B
, hvor NAME er stien til mappen for det projekt, der skal oprettes. Flaget -T
angiver, at Rails ikke skal opsætte nogen testramme for vores nye projekt, hvilket er præcis, hvad vi ønsker. Flaget -B
anviser Rails til at springe over at køre bundle install
på dette tidspunkt. Dernæst skal vi redigere vores Gemfile, så den indeholder følgende:
group :development, :test do
gem 'rspec-rails'
gem 'capybara'
end
Dette tilføjer både RSpec og Capybara til vores udviklings- og testmiljøer. På dette tidspunkt skal du køre bundle
for at installere gems og alle de afhængigheder, som projektet har brug for. Jeg kan godt lide at gå ind i rails console
på dette tidspunkt bare for at kontrollere, at alt fungerer, og hvis ikke – går jeg tilbage til min Gemfile og retter eventuelle problemer.
Nu da vi har vores projektskelet på plads, er det næste skridt at rigge vores testsuite op. Du skal blot køre rails generate rspec:install
på dette tidspunkt for at oprette spec
-mappen og den nødvendige filstruktur. Det sidste skridt er at fortælle vores tests, at de skal bruge Capybara. I spec/rails_helper.rb
tilføjes følgende:
require 'capybara/rspec'
Det var det hele for opsætningen! Før vi går videre, skal vi commit-ændringer, som vi har foretaget i vores projekt: git add . && git commit -m "initial commit"
. Lad os dykke ned i oprettelsen af en controller og lave nogle tests!
For vores testformål vil vi oprette en simpel formular med nogle indgange og derefter bede Capybara om at udfylde nogle eksempeldata og sende formularen. Vi vil ikke bekymre os om at oprette nogen komplekse modeller eller persistere oplysninger til en database. Lad os bede Rails om at oprette en users
controller og opsætte noget routing for os:
rails generate controller Users new --no-helper --no-assets --no-view-specs
Ved at angive --no-helper --no-assets
fortæller vi Rails, at det ikke skal oprette nogen aktiver eller en hjælper til vores controller. Indstillingen --no-view-specs
instruerer generatoren om ikke at oprette nogen tests for visningerne – vi vil senere se, hvordan vi kan oprette de tests, vi ønsker. Rails har oprettet en new
-rute til os, som vi kan se i config/routes.rb
:
Rails.application.routes.draw do
get 'users/new'
end
og i app/controllers/users_controller.rb
:
class UsersController < ApplicationController
def new
end
end
Endeligt har Rails oprettet en visning til os i app/views/users/new.html.erb
. Lad os redigere denne visning for at oprette en simpel formular:
<h1>User Login</h1>
<%= form_tag users_path do %>
<%= label_tag :name %>
<%= text_field_tag :name %>
<%= submit_tag "submit" %>
<% end %>
Vi skal gøre et par ting for at afslutte ledningsføringen af dette. I routes.rb
tilføjes følgende:
post 'users' => 'users#welcome'
Vi skal også tilføje en welcome
handling til users_controller.rb
:
def welcome
@user = params
render :welcome
end
Det sidste skridt her er at oprette views/users/welcome.html.erb
og inkludere noget HTML og ERB for at vise brugerens navn:
<h1><%= "Welcome, #{@user}!" %></h1>
Phew! Hvis vi kører rails server
og går til localhost:3000/users/new
i vores browser, skulle vi blive mødt med en formular, der beder os om at indtaste vores navn. Når vi indtaster vores navn og trykker på submit-knappen, skulle vi blive omdirigeret til en side, der byder os hjerteligt velkommen. Det er alt sammen godt og vel, men det bliver hurtigt trættende at skulle teste vores kode på denne måde for at sikre, at den fungerer, hver gang vi tilføjer en ny formular eller implementerer en ny funktion. Heldigvis er der blevet skabt et værktøj til at teste og automatisere denne proces for os!
Det er her, Capybara kommer ind i billedet. Capybara er et framework, som giver os mulighed for at teste koden i vores visninger ved at udfylde formulardata, inspicere sidens indhold og sende HTTP-forespørgsler til browseren. Lad os opsætte en spec til at teste vores nyoprettede formular:
rails generate rspec:feature form
Dette vil generere filen spec/features/form_spec.rb
. Som standard forventer Capybara at finde specs i en mappe kaldet features
. Lad os redigere denne fil for at tilføje en ny test, som vil udfylde input i tekstfeltet name
og trykke på 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
Det var det! Vi har med succes oprettet vores første test i Rails ved hjælp af RSpec og Capybara. Hvis vi kører rspec --format documentation
, bør vi se, at testen er bestået. Du er velkommen til at eksperimentere – hvad er måder at få testen til at mislykkes på? Er der andre tests, som vi kunne oprette til dette eksempel? Vi har kun skrabet på overfladen her – forhåbentlig får det dig til at tænke over, hvordan du kan forenkle og automatisere processen med at teste din kode ved hjælp af disse værktøjer, og få vanen til at teste din kode ofte.
Besøg her for at se den kode, der blev præsenteret i dette indlæg.