Foto av Karen Lau på Unsplash

Skrivande av tester för applikationskod är något som alla programmerare bör vara bekanta med, oavsett vilket språk eller ramverk de väljer. RSpec är ett otroligt testpaket och DSL (Domain-Specific Language) byggt i Ruby, som gör att du enkelt kan skriva enhetstester med hjälp av en uppsättning fördefinierade metoder. Min introduktion till att skriva kod i Ruby var tätt sammanflätad med erfarenheten av att religiöst köra RSpec för att testa det jag hade skrivit, och när jag började lära mig Rails var det därför mer naturligt och smidigt att fortsätta använda RSpec när jag började lära mig Rails. Som standard använder Rails testramverket MiniTest. Vi kommer att diskutera hur man sätter upp ett nytt Rails-projekt för att använda RSpec, och sedan utforska hur man använder Capybara för att testa våra vyer.

Först skapar vi ett nytt Rails-projekt genom att köra rails new NAME -T -B, där NAME är sökvägen till katalogen för det projekt som ska skapas. Flaggan -T anger att Rails inte ska sätta upp något testramverk för vårt nya projekt, vilket är precis vad vi vill. Flaggan -B instruerar Rails att hoppa över att köra bundle install vid detta tillfälle. Därefter måste vi redigera vår Gemfile för att inkludera följande:

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

Detta lägger till både RSpec och Capybara till våra utvecklings- och testmiljöer. Vid det här laget kör du bundle för att installera gems och alla beroenden som projektet behöver. Jag gillar att gå in i rails console vid det här laget bara för att kontrollera att allt fungerar, och om inte – går jag tillbaka till min Gemfile och fixar eventuella problem.

När vi nu har vårt projektskelett på plats är nästa steg att rigga upp vårt testpaket. Kör helt enkelt rails generate rspec:install vid denna punkt för att skapa spec-katalogen och den nödvändiga filstrukturen. Det sista steget är att tala om för våra tester att använda Capybara. I spec/rails_helper.rb lägger du till följande:

require 'capybara/rspec'

Det var allt för installationen! Innan vi går vidare ska vi bekräfta de ändringar som vi har gjort i vårt projekt: git add . && git commit -m "initial commit". Låt oss dyka in i skapandet av en controller och göra några tester!

Foto av Max Nelson på Unsplash

För våra teständamål kommer vi att skapa ett enkelt formulär med några inmatningar, och sedan säga åt Capybara att fylla i några exempeldata och skicka formuläret. Vi kommer inte att oroa oss för att skapa några komplexa modeller eller persistera information till en databas. Låt oss be Rails att skapa en users controller och konfigurera lite routing för oss:

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

Där vi anger --no-helper --no-assets säger vi till Rails att inte skapa några tillgångar eller en hjälpreda för vår controller. Alternativet --no-view-specs instruerar generatorn att inte skapa några tester för vyerna – vi kommer att se senare hur vi skapar de tester vi vill ha. Rails har skapat en new rutt åt oss, som vi kan se i config/routes.rb:

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

och i app/controllers/users_controller.rb:

class UsersController < ApplicationController
def new
end
end

Slutligt har Rails skapat en vy åt oss i app/views/users/new.html.erb. Låt oss redigera den här vyn för att skapa ett enkelt formulär:

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

Vi måste göra ett par saker för att slutföra kopplingen. I routes.rb lägger vi till följande:

post 'users' => 'users#welcome'

Vi måste också lägga till en welcome-åtgärd i users_controller.rb:

def welcome
@user = params
render :welcome
end

Det sista steget här är att skapa views/users/welcome.html.erb och inkludera lite HTML och ERB för att visa användarens namn:

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

Phew! Om vi kör rails server och går till localhost:3000/users/new i vår webbläsare bör vi mötas av ett formulär där vi uppmanas att ange vårt namn. När vi skriver in vårt namn och trycker på knappen skicka bör vi omdirigeras till en sida som hälsar oss varmt välkomna. Allt detta är bra, men att behöva testa vår kod på detta sätt för att se till att den fungerar varje gång vi lägger till ett nytt formulär eller inför en ny funktion blir snart tröttsamt. Som tur är har ett verktyg skapats för att testa och automatisera denna process åt oss!

Det är här Capybara kommer in i bilden. Capybara är ett ramverk som gör det möjligt för oss att testa koden i våra vyer genom att fylla i formulärdata, inspektera sidans innehåll och skicka HTTP-förfrågningar till webbläsaren. Låt oss sätta upp en spec för att testa vårt nyskapade formulär:

rails generate rspec:feature form

Detta kommer att generera filen spec/features/form_spec.rb. Som standard förväntar sig Capybara att hitta specifikationer i en katalog som heter features. Låt oss redigera den här filen för att lägga till ett nytt test, som fyller i inmatningen i textfältet name och trycker 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

Så är det! Vi har framgångsrikt skapat vårt första test i Rails med hjälp av RSpec och Capybara. Om vi kör rspec --format documentation bör vi se att testet godkänns. Experimentera gärna – vad finns det för sätt att få testet att misslyckas? Finns det andra tester som vi skulle kunna skapa för det här exemplet? Vi har bara skrapat på ytan här – förhoppningsvis får detta dig att tänka på hur du kan förenkla och automatisera processen att testa din kod med hjälp av dessa verktyg, och få in en vana att testa din kod ofta.

Besök här för att se koden som presenteras i det här inlägget.

Lämna ett svar

Din e-postadress kommer inte publiceras.