Tests für Anwendungscode zu schreiben ist etwas, mit dem alle Programmierer vertraut sein sollten, unabhängig von der Sprache oder dem Framework ihrer Wahl. RSpec ist eine unglaubliche Test-Suite und DSL (Domain-Specific Language) in Ruby, die es Ihnen ermöglicht, Unit-Tests mit Leichtigkeit zu schreiben, indem Sie eine Reihe von vordefinierten Methoden verwenden. Meine Einführung in das Schreiben von Code in Ruby war eng mit der Erfahrung verbunden, dass ich RSpec zum Testen dessen, was ich geschrieben hatte, gewissenhaft einsetzte; als ich also anfing, Rails zu lernen, war die weitere Verwendung von RSpec ein natürlicher und nahtloser Übergang. Standardmäßig verwendet Rails das MiniTest-Testframework. Wir werden besprechen, wie man ein neues Rails-Projekt einrichtet, um RSpec zu verwenden, und dann Capybara zum Testen unserer Views verwenden.
Zuerst erstellen wir ein neues Rails-Projekt, indem wir rails new NAME -T -B
ausführen, wobei NAME der Pfad zum Verzeichnis für das zu erstellende Projekt ist. Das -T
-Flag gibt an, dass Rails kein Test-Framework für unser neues Projekt einrichten soll, was genau das ist, was wir wollen. Das Flag -B
weist Rails an, die Ausführung von bundle install
an dieser Stelle zu überspringen. Als nächstes müssen wir unser Gemfile so bearbeiten, dass es folgendes enthält:
group :development, :test do
gem 'rspec-rails'
gem 'capybara'
end
Damit werden sowohl RSpec als auch Capybara zu unserer Entwicklungs- und Testumgebung hinzugefügt. An diesem Punkt führen Sie bundle
aus, um Gems und alle Abhängigkeiten zu installieren, die das Projekt benötigt. Ich möchte an dieser Stelle rails console
aufrufen, um zu überprüfen, ob alles funktioniert, und wenn nicht, gehe ich zurück zu meinem Gemfile und behebe alle Probleme.
Nun, da wir unser Projektgerüst haben, ist der nächste Schritt, unsere Testsuite einzurichten. Führen Sie an dieser Stelle einfach rails generate rspec:install
aus, um das Verzeichnis spec
und die notwendige Dateistruktur zu erstellen. Der letzte Schritt besteht darin, unseren Tests mitzuteilen, dass sie Capybara verwenden sollen. Fügen Sie in spec/rails_helper.rb
Folgendes hinzu:
require 'capybara/rspec'
Das war’s mit der Einrichtung! Bevor wir weitermachen, sollten wir die Änderungen, die wir an unserem Projekt vorgenommen haben, festschreiben: git add . && git commit -m "initial commit"
. Beginnen wir mit dem Erstellen eines Controllers und dem Testen!
Für unsere Testzwecke werden wir ein einfaches Formular mit einigen Eingaben erstellen und dann Capybara anweisen, einige Beispieldaten auszufüllen und das Formular abzuschicken. Wir werden uns nicht um die Erstellung komplexer Modelle oder die Persistenz von Informationen in einer Datenbank kümmern. Weisen wir Rails an, einen users
Controller zu erstellen und ein Routing für uns einzurichten:
rails generate controller Users new --no-helper --no-assets --no-view-specs
Durch die Angabe von --no-helper --no-assets
weisen wir Rails an, keine Assets oder einen Helper für unseren Controller zu erstellen. Die Option --no-view-specs
weist den Generator an, keine Tests für die Views zu erstellen – wir werden später sehen, wie wir die gewünschten Tests erstellen können. Rails hat eine new
-Route für uns erstellt, die wir in config/routes.rb
:
Rails.application.routes.draw do
get 'users/new'
end
und in app/controllers/users_controller.rb
:
class UsersController < ApplicationController
def new
end
end
sehen können. Schließlich hat Rails einen View für uns in app/views/users/new.html.erb
erstellt. Lassen Sie uns diese Ansicht bearbeiten, um ein einfaches Formular zu erstellen:
<h1>User Login</h1>
<%= form_tag users_path do %>
<%= label_tag :name %>
<%= text_field_tag :name %>
<%= submit_tag "submit" %>
<% end %>
Wir müssen ein paar Dinge tun, um die Verkabelung zu beenden. In routes.rb
fügen wir Folgendes hinzu:
post 'users' => 'users#welcome'
Außerdem müssen wir eine welcome
-Aktion zu users_controller.rb
hinzufügen:
def welcome
@user = params
render :welcome
end
Der letzte Schritt ist das Erstellen von views/users/welcome.html.erb
und das Einfügen von HTML und ERB, um den Namen des Benutzers anzuzeigen:
<h1><%= "Welcome, #{@user}!" %></h1>
Puh! Wenn wir rails server
ausführen und in unserem Browser zu localhost:3000/users/new
gehen, sollten wir mit einem Formular begrüßt werden, das uns auffordert, unseren Namen einzugeben. Wenn wir unseren Namen eingeben und auf die Schaltfläche „Absenden“ klicken, sollten wir zu einer Seite weitergeleitet werden, die uns mit einem herzlichen Willkommen begrüßt. Das ist alles schön und gut, aber es wird schnell lästig, unseren Code auf diese Weise zu testen, um sicherzustellen, dass er jedes Mal funktioniert, wenn wir ein neues Formular hinzufügen oder eine neue Funktion implementieren. Zum Glück gibt es ein Tool, das diesen Prozess für uns testet und automatisiert!
Da kommt Capybara ins Spiel. Capybara ist ein Framework, mit dem wir den Code in unseren Ansichten testen können, indem wir Formulardaten ausfüllen, den Seiteninhalt untersuchen und HTTP-Anfragen an den Browser senden. Richten wir eine Spezifikation ein, um unser neu erstelltes Formular zu testen:
rails generate rspec:feature form
Damit wird die Datei spec/features/form_spec.rb
erzeugt. Standardmäßig erwartet Capybara, dass Specs in einem Verzeichnis namens features
zu finden sind. Bearbeiten wir diese Datei, um einen neuen Test hinzuzufügen, der das Textfeld name
ausfüllt, und drücken wir auf Senden:
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
Das war’s! Wir haben erfolgreich unseren ersten Test in Rails mit RSpec und Capybara erstellt. Wenn wir rspec --format documentation
ausführen, sollten wir sehen, dass der Test erfolgreich ist. Experimentieren Sie ruhig – welche Möglichkeiten gibt es, den Test fehlschlagen zu lassen? Gibt es andere Tests, die wir für dieses Beispiel erstellen könnten? Wir haben hier nur an der Oberfläche gekratzt – hoffentlich bringt Sie das dazu, darüber nachzudenken, wie Sie den Prozess des Testens Ihres Codes mit diesen Tools vereinfachen und automatisieren können, und sich angewöhnen, Ihren Code häufig zu testen.
Besuchen Sie hier den in diesem Beitrag vorgestellten Code.