Jeśli jesteś programistą Ruby on Rails, to testowanie jest Twoim chlebem powszednim, jest w Twojej krwi. A może nie miałeś/miałaś jeszcze do czynienia z testami, bo dopiero zaczynasz przygodę z dzieckiem DHH. W każdym razie, mam dla Ciebie wskazówkę, która sprawi, że Twoje testowanie będzie o wiele bardziej czytelne i wygodne. I za każdym razem na hasło RSpec, pomyślisz „czytelna dokumentacja testów”.
Do testowania używam najpopularniejszej biblioteki w świecie RoR – RSpec. Dodatkowo mój setup uzupełnia DatabaseCleaner, ShouldaMatchers i FactoryBotRails.
group :test do
gem 'rspec-rails',
gem 'factory_bot_rails'
gem 'shoulda-matchers'
gem 'database_cleaner'
end
ENV["RAILS_ENV"] ||= "test"
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'shoulda/matchers'
Dir[Rails.root.join("spec/support/**/*.rb)].each { |f| require f }
RSpec.configure do |config|
config.fixture_path = "#{::Rails.root}/spec/fixtures"
config.use_transactional_fixtures = true
config.infer_spec_type_from_file_location!
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.strategy = example.metadata[:js] ? :truncation : :transaction
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
Shoulda::Matchers.configure do |config|
config.integrate do |with|
with.test_framework :rspec
with.library :rails
end
end
Kod, który będziemy testować wygląda następująco:
class Fotballer < ApplicationRecord
validates :name, presence: true, length: { maximum: 250 }
validates :surname, presence: true, length: { maximum: 250 }
validates :club, length: { maximum: 250 }
validates :nationality, presence: true, length: { maximum: 30 }
end
require 'rails_helper'
RSpec.describe Footballer, type: :model do
describe "database columns" do
it { should have_db_column(:name).of_type(:string) }
it { should have_db_column(:surname).of_type(:string) }
it { should have_db_column(:club).of_type(:string) }
it { should have_db_column(:nationality).of_type(:string)
end
end
Przy podstawowej konfiguracji RSpeca, umieszczonej w pliku spec_helper.rb
i wykonywaniu testów konsola nie drukuje nam zbyt czytelnych komunikatów, a śledzenie postępu poszczególnych testów jest niemożliwe. Spójrzmy tylko na to, co otrzymujemy.

Co jeśli chcielibyśmy na bieżąco monitorować postęp testów i sprawdzić, co już się wykonało i jest na zielono, a co nie przeszło? Wystarczy lekko zmienić konfigurację RSpeca w spec_helper.rb
i ustawić config.color
na true
i config.formatter
na :documentation
.
RSpec.configure do |config|
config.color = true
config.tty = true
config.formatter = :documentation
end
Rezultat testów wygląda znacznie lepiej niż poprzednio.



Osobiście dużą wagę przywiązuję do tego, jak test drukuje się w konsoli. W przypadku błędu o wiele łatwiej dojść, gdzie leży problem. A poza tym sprawdzając cały system, już w trakcie wykonywania testów jestem w stanie oszacować ile jeszcze poprawek mnie czeka.
Jeśli natomiast masz ochotę wysiąść z konsoli i edytora i użyć jedynego słusznego obecnie IDE dla RoR, jakim jest Ruby Mine, to tam testy są świetnie obsłużone. Sam teraz preferują to narzędzie. Wystarczy jeden klik i postęp testów jest czytelny i zrozumiały. Ważne, żeby wybrać coś pod własne preferencje.
Tak czy inaczej, dla mnie zawsze zestawienie: RSpec – czytelna dokumentacja testów, będzie tożsame.
Poczytaj na ten temat w dokumentacji RSpec.
Zobacz też jak używać komendy git commit –amend oraz jak przechowywać klucze w aplikacji React Native.