July 14, 2008 by alex
Wir sind gerade mit einem neuen Projekt gestartet - alles richtig “nach Lehrbuch”: kurze Iterationen, Iteration Planning zusammen mit dem Kunden, Behavior Driven Design, User Stories, automatisierte acceptance Tests - all die schönen Dinge die man in so einem modernen agilen Softwareprojekt haben will.
Während der Planung der ersten Iteration haben wir zusammen mit dem Kunden User Stories geschrieben, um sie anschließend direkt in den RSpec Story Runner zu werfen, also As a User I want to upload my photo So that everyone can see my smiley face
. Da unsere Kunden deutsch sprechen war das Meeting und dementsprechend auch die Stories auf deutsch, also Als Benutzer will ich mein Foto hochladen können damit alle mein tolles Grinsegesicht sehen können
. Damit der Story Runner damit umgehen konnte mussten wir ihm eine neue Sprache beibringen. So geht’s:
In diesem Ticket gibt’s einen Patch für den Story Runner, womit die Schlüsselwörter in den plain text stories konfiguriert werden können. (Wer wie ich mit Kommandozeilenpatchen nicht klar kommt, TextMate hat ein schönes Diff Bundle mit dem man den Patch auf einen RSpec (z.B. 1.1.4) checkout anwenden kann).
Die Konfiguration kann dann einfach in der stories/helper.rb landen:
Spec::Runner.configure do |config|
config.with_story_template_words({
:story => "Story",
:scenario => 'Szenario',
:given => 'Gegeben',
:given_scenario => 'Gegebenes Szenario',
:when => 'Wenn',
:then => 'Dann',
:and => 'Und'
})
end
Was diesem Patch allerdings noch fehlt ist die Übersetzung der zu jeder plain text gehörenden steps. Man füge einfach noch folgendes Snippet mit ein:
module Spec
module Story
class StepGroup
alias_method :Wenn, :When
alias_method :Gegeben, :Given
alias_method :Dann, :Then
end
end
end
Und schon kann man seine Stories auf deutsch schreiben (sorry das Beispiel ist irgendwie grauenhaft sinnlos, es ist schon spät):
Story: Als ich will ich ich sein damit ich mal so richtig ich sein kann
Szenario: ich bin ich bin ich
Gegben ich
Wenn ich ich bin
Dann soll ich auch ich sein
Und dann in den zugehörigen steps:
require File.join(File.dirname(__FILE__), '../helper')
with_steps_for :common do
Gegeben 'ich' do
@me = create_me
end
Wenn 'ich ich bin' do
@me.be_me
end
Dann 'soll $expected auch $result sein' do |expected, result|
expected.should == result
end
run File.dirname(__FILE__) + '/ich_story.txt', :type => RailsStory
end
Ach ja, one more thing: Um im Story Runner so eine Art setup/teardown zu haben, einfach noch ein wenig Code in den helper:
class MyStoryListener
def scenario_started(story, scenario)
# hier setup code
end
def method_missing(method, *args)
# no-op
end
end
Spec::Story::Runner.register_listener(MyStoryListener.new)