2010-12-12 5 views
0

ich einen Schritt, die mit dem folgenden versagt ...Extra-Raum in Gurke Schritt, wenn to_s mit (: lang)

expected #has_content?("July 4, 2009") to return true, got false 

Das Problem, denke ich, ist der zusätzliche Raum zwischen „Juli“ und " 4 ". Ich benutze published_on.to_s (: long) sowohl in der Schrittdefinition als auch in der Ansicht, daher bin ich mir nicht ganz sicher, woher der zusätzliche Platz kommt.

Irgendwelche Ideen?

+0

Zeigen Sie uns bitte den Schritt und seine Definition. –

+0

Hier sind die Schrittdefinitionen -> https://gist.github.com/b6ba990085532c6d05bf –

Antwort

2

Es ist, was passiert, wenn Sie versuchen:

Date.civil(2010, 7, 4).strftime("%e") # => " 4" 

Und Rails verwendet %e in ihren :longformat. Das Lustige ist, dass %e nicht documented ist.

Ich würde meine Schrittdefinition so anpassen, dass sie dem Ruby-Verhalten entspricht, wenn Sie sich nicht um den zusätzlichen Platz kümmern (zusätzliche Leerzeichen werden sowieso nicht in HTML angezeigt). Wenn Sie dagegen tun Pflege, zerquetschen es:

Date.civil(2010, 7, 4).to_s(:long).squish # => "July 4, 2010" 

Squish in Rails verfügbar ist 3. Wenn Sie mit Rails 2, können Sie gsub:

Date.civil(2010, 7, 4).to_s(:long).gsub(/\s+/, " ") # => "July 4, 2010" 
+0

Yup, Gurke (genau wie Browser) ignoriert wiederholte HTML, so dass obwohl in der Quelle das Datum 2 Leerzeichen hat, sieht Gurke es nur als ein. – Jacob

0

Ich lief in das gleiche Problem mit meinem Gurken Test heute!

Das Problem (wie bereits erwähnt) ist Date::DATE_FORMATS[:long] ist "%B %e, %Y". Die %e nach ri strftime, ergibt sich ein Leerzeichen aufgefüllt Tage Nummer:

%d - Day of the month, zero-padded (01..31) 
      %-d no-padded (1..31) 
    %e - Day of the month, blank-padded (1..31) 

So standardmäßig ist das, was ich in Rails siehe 3.1.3:

> d = '2012-02-01'.to_date 
=> Wed, 01 Feb 2012 

> d.to_s(:long) 
=> "February 1, 2012" 

Merkwürdigerweise Rails Anwendungen ein anderes Tag-Format für das Format der :longmal (%d, die "01" ergibt), wie für Daten (%e, worin Y ields " 1"):

> d = '2012-02-01'.to_time 
=> 2012-02-01 00:00:00 UTC 

> d.to_s(:long) 
=> "February 01, 2012 00:00" 

> Time::DATE_FORMATS[:long] 
=> "%B %d, %Y %H:%M" 

> Date::DATE_FORMATS[:long] 
=> "%B %e, %Y" 

Die Lösung dann "%-d" für den Tag in Ihrem Format-String statt %e zu verwenden ist:

> Date::DATE_FORMATS[:long] = "%B %-d, %Y" 
=> "%B %-d, %Y" 

> d = '2012-02-01'.to_date 
Wed, 01 Feb 2012 

> d.to_s(:long) 
=> "February 1, 2012" 

Sie nur diese Zeile zu einem neuen initializer hinzufügen , config/initializers/date_formats.rb:

Date::DATE_FORMATS[:long] = "%B %-d, %Y" 

Bitte kommentieren Sie https://github.com/rails/rails/pull/1994, wenn Sie möchten, dass dieser Standard in Rails geändert wird.

0

Für was es wert ist, würde ich lieber die "%-d" fix (oder sogar "%-e"!was gibt die gleichen Ergebnisse) als ".squish", die Rails-spezifisch ist, und nicht so portabel (warum nicht die Ruby-native ".squeeze" oder sogar ".squeeze(' ')" dann verwenden, wenn Sie nicht mit den Datumsformaten herumspielen wollen?).

Auch als Update: @iain erwähnt, dass "% e" nicht dokumentiert ist. Für was es wert ist, it is now! (Obwohl interessanterweise nicht "%-e" speziell, die, wenn Sie es versuchen, ist gültig, und funktioniert!)