RSpec - Haczyki
Podczas pisania testów jednostkowych często wygodnie jest uruchomić konfigurację i kod dezaktywacji przed i po testach. Kod instalacji to kod, który konfiguruje lub „ustawia” warunki testu. Kod dezaktywacji wykonuje porządki, upewnia się, że środowisko jest spójne dla kolejnych testów.
Ogólnie rzecz biorąc, Twoje testy powinny być od siebie niezależne. Kiedy uruchamiasz cały zestaw testów i jeden z nich kończy się niepowodzeniem, chcesz mieć pewność, że się nie powiódł, ponieważ testowany kod zawiera błąd, a nie dlatego, że poprzedni test pozostawił środowisko w niespójnym stanie.
Najpopularniejsze haki używane w RSpec to haki przed i po. Umożliwiają one zdefiniowanie i uruchomienie kodu konfiguracji i dezaktywacji, które omówiliśmy powyżej. Rozważmy ten przykładowy kod -
class SimpleClass
attr_accessor :message
def initialize()
puts "\nCreating a new instance of the SimpleClass class"
@message = 'howdy'
end
def update_message(new_message)
@message = new_message
end
end
describe SimpleClass do
before(:each) do
@simple_class = SimpleClass.new
end
it 'should have an initial message' do
expect(@simple_class).to_not be_nil
@simple_class.message = 'Something else. . .'
end
it 'should be able to change its message' do
@simple_class.update_message('a new message')
expect(@simple_class.message).to_not be 'howdy'
end
end
Po uruchomieniu tego kodu otrzymasz następujące dane wyjściowe -
Creating a new instance of the SimpleClass class
.
Creating a new instance of the SimpleClass class
.
Finished in 0.003 seconds (files took 0.11401 seconds to load)
2 examples, 0 failures
Przyjrzyjmy się bliżej temu, co się dzieje. Metoda before (: each) służy do definiowania kodu konfiguracji. Przekazując: each argument, nakazujesz metodzie before, aby była uruchamiana przed każdym przykładem w Twojej grupie przykładów, tj. Dwa, które blokuje wewnątrz bloku opisującego w powyższym kodzie.
W wierszu: @simple_class = SimpleClass.new tworzymy nową instancję klasy SimpleClass i przypisujemy ją do zmiennej instancji obiektu. Jaki obiekt możesz się zastanawiać? RSpec tworzy specjalną klasę za kulisami w zakresie bloku opisu. Umożliwia to przypisywanie wartości zmiennym instancji tej klasy, do których można uzyskać dostęp w ramach bloków it w przykładach. Ułatwia to również pisanie czystszego kodu w naszych testach. Jeśli każdy test (przykład) potrzebuje instancji SimpleClass, możemy umieścić ten kod w podpięciu przed i nie musimy go dodawać do każdego przykładu.
Zwróć uwagę, że wiersz „Tworzenie nowej instancji klasy SimpleClass” jest zapisywany w konsoli dwukrotnie, co pokazuje, że przed wywołaniem hooka w każdym z it blocks.
Jak już wspomnieliśmy, RSpec ma również przechwycenie after, a oba zaczepy przed i po mogą przyjmować: all jako argument. Hak after będzie działał za określonym celem. Cel: all oznacza, że hak będzie działał przed / po wszystkich przykładach. Oto prosty przykład ilustrujący, kiedy wywoływany jest każdy punkt zaczepienia.
describe "Before and after hooks" do
before(:each) do
puts "Runs before each Example"
end
after(:each) do
puts "Runs after each Example"
end
before(:all) do
puts "Runs before all Examples"
end
after(:all) do
puts "Runs after all Examples"
end
it 'is the first Example in this spec file' do
puts 'Running the first Example'
end
it 'is the second Example in this spec file' do
puts 'Running the second Example'
end
end
Po uruchomieniu powyższego kodu zobaczysz to wyjście -
Runs before all Examples
Runs before each Example
Running the first Example
Runs after each Example
.Runs before each Example
Running the second Example
Runs after each Example
.Runs after all Examples