Neu: Das englische Ruby on Rails 4.0 Buch.

7.4. Integration Tests

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.

Autor

Stefan Wintermeyer