Testgetriebene Entwicklung (TDD) ist ein muß mit Rails. Wer sich dem versperrt steht sich selbst im Weg und wer nicht zuerst einen Test schreibt, sondern nach der Implementierung der Logik seinen Code irgendwie absichert, hat die umfassende Philosphie der Testgetriebenen Entwicklung noch nicht verstanden. In dem Fall hilft nur: http://www.amazon.de/xUnit-Test-Patterns-Refactoring-Signature/dp/013149...
Der Scaffolder erzeugt mit jedem Controller auch gleich die Unit Tests die diesen absichern. Dort wird eifrig gebraucht gemacht von assert_difference und nicht sofort erschliesst sich dem Neuling die komplette Syntax.
Aus dem Functional Test:
def test_should_create_client
# Nimm an das die sich Anzahl von Client.count sich nach dem Ausführen um 1 erhöht hat
assert_difference('Client.count') do
post :create, :client => { }
end
assert_redirected_to client_path(assigns(:client))
end
Um das komplett verstehen zu können muss man sich die Implementierung der Funktion ansehen:
def assert_difference(expressions, difference = 1, message = nil, &block)
Jetzt wird es klarer: expressions wird mittels eval ausgewertet, Angenommener Standardunterschied ist 1. Würde man also zwei neue Client Objekte erzeugen müsste der Testcode so aussehen:
assert_difference('Client.count', 2) do
post :create, :client => { }
post :create, :client => { }
end
Und tatsächlich läuft mein derart modifierter Test ohne Fehler.
Fazit: assert_difference ist ein sehr nützlicher Helfer der deb Testcode verkürzt hilft das DRY Prinzip einzuhalten.