We are a software consultancy based in Berlin, Germany. We deliver
high quality web apps in short timespans.

Upstream Agile GmbH

RSpec Story Runner auf deutsch

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)