Pisanie testów dla kodu aplikacji jest czymś, co wszyscy programiści powinni umieć robić, niezależnie od wybranego języka czy frameworka. RSpec jest niesamowitym pakietem testującym i DSL (Domain-Specific Language) zbudowanym w Ruby, który pozwala na pisanie testów jednostkowych z łatwością przy użyciu zestawu predefiniowanych metod. Moje wprowadzenie do pisania kodu w Ruby było ściśle powiązane z doświadczeniem religijnego uruchamiania RSpeca w celu przetestowania tego co napisałem; więc kiedy zacząłem uczyć się Railsów, kontynuowanie używania RSpeca było bardziej naturalnym i płynnym przejściem. Domyślnie, Railsy używają frameworka testującego MiniTest. Omówimy, jak skonfigurować nowy projekt Rails, aby używać RSpec, a następnie zbadamy użycie Capybary do testowania naszych widoków.
Po pierwsze, stworzymy nowy projekt Rails przez uruchomienie rails new NAME -T -B
, gdzie NAME jest ścieżką do katalogu dla projektu, który powinien być utworzony. Flaga -T
określa, że Railsy nie powinny ustawiać żadnych ram testowych dla naszego nowego projektu, co jest dokładnie tym, czego chcemy. Flaga -B
instruuje Railsy by pominęły uruchomienie bundle install
w tym momencie. Następnie, musimy edytować nasz Gemfile, aby zawierał następujące elementy:
group :development, :test do
gem 'rspec-rails'
gem 'capybara'
end
To dodaje zarówno RSpec jak i Capybara do naszych środowisk deweloperskich i testowych. W tym momencie, uruchom bundle
aby zainstalować klejnoty i wszelkie zależności, których potrzebuje projekt. Lubię wpadać do rails console
w tym momencie, aby sprawdzić, czy wszystko działa, a jeśli nie – wracam do mojego Gemfile i naprawiam wszelkie problemy.
Teraz, gdy mamy już nasz szkielet projektu na miejscu, następnym krokiem jest przygotowanie naszego zestawu testowego. Po prostu uruchom rails generate rspec:install
w tym momencie, aby utworzyć katalog spec
i niezbędną strukturę plików. Ostatnim krokiem jest powiedzenie naszym testom, aby używały Capybary. W spec/rails_helper.rb
, dodaj następującą treść:
require 'capybara/rspec'
To wszystko jeśli chodzi o konfigurację! Zanim przejdziemy dalej, zatwierdźmy zmiany, które wprowadziliśmy do naszego projektu: git add . && git commit -m "initial commit"
. Zajmijmy się tworzeniem kontrolera i testowaniem!
Dla celów testowych stworzymy prosty formularz z kilkoma danymi wejściowymi, a następnie powiemy Capibarze, aby wypełniła przykładowe dane i przesłała formularz. Nie będziemy się martwić o tworzenie żadnych złożonych modeli czy persystencję informacji do bazy danych. Powiedzmy Railsom, aby stworzyły users
kontroler i skonfigurowały dla nas routing:
rails generate controller Users new --no-helper --no-assets --no-view-specs
Określając --no-helper --no-assets
mówimy Railsom, aby nie tworzyły żadnych zasobów ani helpera dla naszego kontrolera. Opcja --no-view-specs
instruuje generator, aby nie tworzył żadnych testów dla widoków – zobaczymy później jak stworzyć testy, które chcemy. Rails stworzył dla nas trasę new
, którą możemy zobaczyć w config/routes.rb
:
Rails.application.routes.draw do
get 'users/new'
end
And in app/controllers/users_controller.rb
:
class UsersController < ApplicationController
def new
end
end
Finally, Rails stworzył dla nas widok w app/views/users/new.html.erb
. Wyedytujmy ten widok, aby stworzyć prosty formularz:
<h1>User Login</h1>
<%= form_tag users_path do %>
<%= label_tag :name %>
<%= text_field_tag :name %>
<%= submit_tag "submit" %>
<% end %>
Musimy zrobić kilka rzeczy, aby zakończyć podłączanie tego. W routes.rb
dodajemy następujące elementy:
post 'users' => 'users#welcome'
Musimy również dodać akcję welcome
do users_controller.rb
:
def welcome
@user = params
render :welcome
end
Ostatnim krokiem jest utworzenie views/users/welcome.html.erb
i dodanie trochę HTML i ERB, aby wyświetlić nazwę użytkownika:
<h1><%= "Welcome, #{@user}!" %></h1>
Phew! Jeśli uruchomimy rails server
i przejdziemy do localhost:3000/users/new
w naszej przeglądarce, powinniśmy zostać przywitani przez formularz z prośbą o wpisanie naszego imienia. Kiedy wpiszemy nasze imię i wciśniemy przycisk wyślij, powinniśmy zostać przekierowani na stronę witającą nas ciepłym powitaniem. Wszystko to jest dobre, ale konieczność testowania naszego kodu w ten sposób, aby upewnić się, że działa za każdym razem, gdy dodajemy nowy formularz lub implementujemy nową funkcjonalność, szybko stanie się męcząca. Na szczęście powstało narzędzie, które testuje i automatyzuje ten proces za nas!
To właśnie tutaj pojawia się Capybara. Capybara jest frameworkiem, który pozwala nam testować kod w naszych widokach poprzez wypełnianie danych w formularzach, inspekcję zawartości strony i wysyłanie żądań HTTP do przeglądarki. Skonfigurujmy specyfikację, aby przetestować nasz nowo utworzony formularz:
rails generate rspec:feature form
To wygeneruje plik spec/features/form_spec.rb
. Domyślnie Capybara oczekuje, że spec znajdzie się w katalogu o nazwie features
. Wyedytujmy ten plik, aby dodać nowy test, który wypełni pole tekstowe name
i naciśnijmy 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
To jest to! Udało nam się stworzyć nasz pierwszy test w Railsach przy użyciu RSpec i Capybara. Jeśli uruchomimy rspec --format documentation
, powinniśmy zobaczyć, że test został zaliczony. Nie krępuj się eksperymentować – jakie są sposoby na to, aby test się nie powiódł? Czy istnieją inne testy, które moglibyśmy stworzyć dla tego przykładu? Mamy nadzieję, że to tylko zarysowało powierzchnię – mamy nadzieję, że to skłoni cię do myślenia o tym, jak możesz uprościć i zautomatyzować proces testowania swojego kodu za pomocą tych narzędzi i wyrobić sobie nawyk częstego testowania swojego kodu.
Witaj tutaj, aby zobaczyć kod przedstawiony w tym poście.