3 Stimmen

Automatische Erkennung von Gebietsschemata im WWW-Browser und Testen mit Cucumber

Ich teste meine Anwendung mit Cucumber und es funktionierte, bevor ich die automatische Erkennung von Gebietsschemata vom WWW-Browser in application_controller.rb hinzugefügt habe:

  before_filter :set_locale

  private

    def set_locale
      xxx = request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first
      if xxx.match /^(en|fr)$/
        I18n.locale = xxx
      else
        I18n.locale = 'en'
      end
    end

Ich habe ein Szenario:

  Scenario: Successful sign up
    Given I am an anonymous user
    And I am on the home page
    When ...

Wenn ich laufe Gurke erhalte ich eine Fehlermeldung:

Given I am an anonymous user                   # features/step_definitions/user_steps.rb:7
And I am on the home page                      # features/step_definitions/webrat_steps.rb:6
  private method `scan' called for nil:NilClass (NoMethodError)
  C:/workspace/jeengle/app/controllers/application_controller.rb:33:in `set_locale'
  c:/worktools/ruby/lib/ruby/1.8/benchmark.rb:308:in `realtime'
  (eval):2:in `/^I am on (.+)$/'
  features/manage_users.feature:8:in `And I am on the home page'

Ich habe versucht, es zu tun in vor Anweisung im Ordner step_definitions:

Before do
  request.env['HTTP_ACCEPT_LANGUAGE'] = "en"
end

aber ich habe einen anderen Fehler:

  undefined method `env' for nil:NilClass (NoMethodError)

Weiß jemand, wie man eine Initialisierung/Emulation request.env['HTTP_ACCEPT_LANGUAGE'] in Gurke?


AKTUALISIERT

Cucumber-Test bestanden, als ich umgeschrieben habe festlegen_ort Methode:

  xxx = request.env['HTTP_ACCEPT_LANGUAGE']    
  if xxx
    xxx = xxx.scan(/^[a-z]{2}/).first
    if xxx.match /^(en|ru)$/
      I18n.locale = xxx
  end
  else
    I18n.locale = 'en'
  end

Es ist keine Lösung, aber es funktioniert.

4voto

zetetic Punkte 46520

Eigentlich liegt das Problem bei Webrat, nicht bei Cucumber. Die Abfolge der Ereignisse ist (grob)

  • Cucumber führt Ihr Feature aus
  • Wenn der Schritt "Ich bin auf der Startseite" erreicht ist, ruft er Webrat auf, um die Anfrage an den Controller zu stellen
  • Webrat erstellt eine Anfrage und sendet sie an den Controller
  • Der Schritt schlägt fehl, weil die Anfrage keinen "Accept-Language"-Header hat

Offenbar fügt Webrat diese Kopfzeile nicht hinzu, wenn es die Anfrage erstellt. Webrat bietet jedoch eine Abhilfe: die "Header"-Methode, mit der jede Kopfzeile für die Dauer der Anfrage gesetzt werden kann.

Damit dies funktioniert, fügen Sie einen Schritt hinzu, der die Kopfzeile einfügt, z. B.:

Given /^an Accept Language header$/ do
  header "Accept-Language", "en;en-us" # or whatever value you need for testing
end`

Führen Sie diesen Schritt aus, bevor Sie eine Seite besuchen, und Webrat ist nicht mehr verwirrt.

Übrigens habe ich das von Das Rspec-Buch die wirklich gut erklärt, wie dieses BDD-Zeug zusammenpasst.

2voto

Voldy Punkte 12526

Eine andere Möglichkeit ist "gleich, aber anders". Sie können die Anweisung before in Ihre Schrittdefinitionsdatei aufnehmen:

Before do
  header 'Accept-Language', 'en-US' 
end

Dies wird vor jedem Szenario durchgeführt und sie bleiben klar und sauber.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X