Neu: udemy Kurs Ruby für Anfänger von Stefan Wintermeyerdiv class="para">Integration Tests sind Tests, die wie Functional Tests arbeiten,
aber über mehrere Controller gehen können und zusätzlich auch den Inhalt
eines generierten Views analysieren können. Man kann mit ihnen deshalb
komplexe Workflows innerhalb der Rails-Applikation nachbilden. Als
Beispiel werden wir einen Integration Test schreiben, der versucht über
die Web-GUI einen neuen User anzulegen, aber dabei den
login_name
vergisst und deshalb entsprechende
Flash-Fehler-Nachrichten erhält.
Mit
rake generate scaffold werden zwar Unit und
Functional Tests generiert, aber keine Integration Tests. Dies können Sie
entweder von Hand im Verzeichnis
test/integration/
oder bequemer mit
rails generate integration_test
machen. Legen wir mal einen Integration Test an:
MacBook:webshop xyz$ rails generate integration_test invalid_new_user_workflow
invoke test_unit
create test/integration/invalid_new_user_workflow_test.rb
MacBook:webshop xyz$
Diese Datei
test/integration/invalid_new_user_workflow_test.rb
füllen wir jetzt mit folgendem Test:
require 'test_helper'
class InvalidNewUserWorkflowTest < ActionDispatch::IntegrationTest
fixtures :all
test 'try to create a new empty user and check for flash error messages' do
get '/users/new'
assert_response :success
post_via_redirect "/users", :last_name => "Oberhuber"
assert_equal '/users', path
assert_select 'li', "Login name can't be blank"
assert_select 'li', "Login name must include at least one of the special characters -_."
end
end
Der Zauber des Integration Tests liegt unter anderem in der Methode
post_via_redirect,
mit der Sie nach einem Post im
Test weitermachen können. Diese Methode steht Ihnen nur innerhalb eines
Integration Tests zur Verfügung.
Alle Integration Tests lassen sich mit
rake
test:integration ausführen. Machen wird das mal:
MacBook:webshop xyz$ rake test:integration
Run options:
# Running tests:
.
Finished tests in 0.238591s, 4.1913 tests/s, 16.7651 assertions/s.
1 tests, 4 assertions, 0 failures, 0 errors, 0 skips
MacBook:webshop xyz$
Das Beispiel zeigt deutlich, dass man vieles ohne den manuellen
Einsatz eines Webbrowsers zum Ausprobieren programmieren kann. Hat man
erst einmal einen Test für den entsprechenden Workflow geschrieben, kann
man sich in Zukunft darauf verlassen, dass dies auch so durchläuft und
muss es nicht immer noch von Hand am Browser ausprobieren.