RSpec to narzędzie do testowania języka specyficznego dla domeny (DSL), które zostało stworzone w celu testowania kodu Ruby. Pomysł jest taki, aby najpierw napisać testy, a następnie napisać wystarczającą ilość kodu, aby przejść testy, a następnie przeprowadzić refaktoryzację. Ponieważ RSpec jest narzędziem do testowania programowania sterowanego zachowaniem (BDD), koncentruje się na opisaniu tego, co robi aplikacja i czy jest zgodna ze specyfikacją. RSpec ma być naprawdę łatwy do odczytania. Przyjęcie podejścia opartego na testach sprawi, że staniesz się lepszym programistą, ponieważ zmusza Cię do krytycznego myślenia o programie i jego funkcjach. Dzisiaj pokażę Ci, jak łatwo jest zacząć pisać testy przy użyciu RSpec.

Najpierw zaczniemy od upewnienia się, że RSpec jest zainstalowany. Jest to bardzo proste, wystarczy zainstalować klejnot RSpec za pomocą tego polecenia.

gem install rspec

Teraz mamy zainstalowany rspec i możemy wygenerować kilka plików konfiguracyjnych. Najpierw utwórz i przejdź do katalogu. Następnie uruchomimy polecenie, które utworzy pliki konfiguracyjne.

mkdir rspec_example
cd rspec_example/
rspec --init

To polecenie utworzy dwa pliki, pierwszy znajduje się w folderze o nazwie spec o nazwie spec_helper.rb, a drugi to .rspec. Wewnątrz tego folderu specyfikacji znajduje się miejsce, w którym będziemy pisać nasze testy. Możemy zacząć od prostego przykładu. Spróbujmy zrobić program powitalny, który przyjmie imię i przywita Cię. Najpierw utwórzmy plik Ruby w głównym katalogu i plik specyfikacji powitania w folderze spec.

touch greeting.rb
touch spec/greeting_spec.rb

W pliku pozdrowienia.rb utworzymy klasę pozdrowień, która będzie inicjowana nazwą.

class Greeting
  def initialize(name)
    @name = name
  end
end

Teraz, podążając za rozwojem opartym na testach, napiszmy test implementujący powitanie. Chcemy, aby klasa Powitanie posiadała metodę, która będzie się witać po wywołaniu. Zacznijmy budować szkielet testowy dla naszego powitania_spec.rb.

require './greeting'
RSpec.describe Greeting do

end

Najpierw wymagamy „./pozdrowienia”. W pliku testowym opisujemy zachowanie klasy. Aby RSpec wiedział z jaką klasą mamy do czynienia musimy owinąć definicję testu blokiem RSpec.describe. Ważne jest, aby wiedzieć, że nazwa klasy nie jest obowiązkowa i można ją zastąpić ciągiem znaków, jeśli chcesz. Słowo „opisz” jest słowem kluczowym RSpec i jest używane do opisania „Grupy Przykładów”, którą można traktować jako zbiór testów. W naszym programie potrzebujemy metody, która będzie wyświetlać powitanie zawierające imię i nazwisko. Teraz możemy zacząć opisywać metodę.

require './greeting'
RSpec.describe Greeting do
  describe '#greet_me' do
    it 'prints a greeting with the name' do
    end
  end
end

Słowo kluczowe „it” służy do zdefiniowania „Przykładu”, który jest naszym testem. Podobnie jak w opisie, akceptuje nazwę klasy lub argument w postaci ciągu znaków i powinien być używany z argumentem blokowym. Wewnątrz tego bloku będziemy testować zachowanie naszego programu. Chcemy stworzyć nową instancję klasy Powitanie i wywołać na niej metodę greet_me. Następnie powinniśmy się spodziewać, że wyśle ​​powitanie. Nasz test będzie teraz wyglądał tak.

require './greeting'
RSpec.describe Greeting do
  describe '#greet_me' do
    it 'prints a greeting with the name' do
      greeting = Greeting.new('Ray')
      expect(greeting.greet_me).to eq('Hello Ray')
    end
  end
end

Słowo kluczowe oczekiwanie w RSpec służy do definiowania „Oczekiwania”. Na tym etapie sprawdzamy, czy spełnione zostały określone oczekiwania. Metodę .eq określa się mianem mechanizmu dopasowującego. Kiedy zostanie wywołana metoda greet_me i wynik będzie równy „Hello Ray”, test zakończy się pomyślnie. Składnia jest bardzo łatwa do odczytania i brzmi prawie tak samo jak zwykły angielski. Śmiało, uruchom polecenie rspec na terminalu, a zobaczysz coś takiego.

rspec
Failures:
1) Greeting#greet_me prints a greeting with the name
     Failure/Error: expect(greeting.greet_me).to eq('Hello Ray')
     
     NoMethodError:
       undefined method `greet_me' for #<Greeting:0x00005639ee5775c8 @name="Ray">
     # ./spec/greeting_spec.rb:7:in `block (3 levels) in <top (required)>'
Finished in 0.00139 seconds (files took 0.06321 seconds to load)
1 example, 1 failure

Test nie został zaliczony, ponieważ nie mamy zdefiniowanej metody greet_me. Przejdźmy więc krok po kroku i utwórzmy metodę o nazwie greet_me w pliku pozdrowienia.rb.

class Greeting
  def initialize(name)
    @name = name
  end
  def greet_me

  end
end

Teraz, gdy mamy zdefiniowaną metodę, uruchom ponownie rspec i zauważysz, że błąd wygląda następująco.

Failures:
1) Greeting#greet_me prints a greeting with the name
     Failure/Error: expect(greeting.greet_me).to eq('Hello Ray')
     
       expected: "Hello Ray"
            got: nil
     
       (compared using ==)
     # ./spec/greeting_spec.rb:7:in `block (3 levels) in <top (required)>'
Finished in 0.01522 seconds (files took 0.06191 seconds to load)
1 example, 1 failure

Błąd informuje, że spodziewa się zobaczyć „Hello Ray”, ale zamiast tego otrzymał zero. Być może będziesz w stanie zobaczyć, jak ta pętla informacji zwrotnej może być pomocna w budowaniu kodu. Teraz, gdy wiemy, jaki będzie następny krok, przejdźmy do zdania testu. Dodajmy to do naszego kodu.

class Greeting
  def initialize(name)
    @name = name
  end
  def greet_me
    "Hello #{@name}"
  end
end

Teraz, gdy uruchomimy RSpec, zobaczysz, że wszystkie testy poszły pomyślnie!

Finished in 0.00151 seconds (files took 0.06547 seconds to load)
1 example, 0 failures

Testy są również świetną częścią dokumentacji. Możesz uruchomić polecenie, które pokaże Ci, za co odpowiada dana metoda. W ten sposób, jeśli ktoś jest nowy w projekcie i chce dowiedzieć się więcej o klasie Pozdrowienia, może zobaczyć, jak się ona zachowuje.

rspec --format documentation

Greeting
  #greet_me
    prints a greeting with the name
Finished in 0.00095 seconds (files took 0.06487 seconds to load)
1 example, 0 failures

Testowanie pomoże Ci upewnić się, że Twój kod zachowuje się dokładnie tak, jak tego chcesz. Dzięki temu procesowi staniesz się także lepszym programistą. Doświadczenie w RSpec pojawia się w większości ofert pracy, więc jest to cenna wiedza i może Ci się przydać, jeśli planujesz pracować jako programista Ruby. Miłej zabawy w pisaniu testów i szczęśliwego kodowania! 😎