使用to_s时的黄瓜步骤中的额外空间(:长)

时间:2010-12-12 04:53:53

标签: ruby-on-rails cucumber capybara

我的步骤因以下内容而失败...

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

我认为问题是“七月”和“四号”之间的额外空间。我在步骤定义和视图中都使用了published_on.to_s(:long),所以我不完全确定额外空间的来源。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

当你尝试时会发生什么:

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

Rails在%e format中使用:long。有趣的是%e不是documented

如果您不关心额外的空间,我会调整我的步骤定义以匹配Ruby行为(无论如何,额外的空格都不会显示在HTML中)。如果你关心它,就把它压扁:

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

在Rails 3中可以使用Squish。如果您使用的是Rails 2,则可以使用gsub:

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

答案 1 :(得分:0)

今天我的黄瓜测试遇到了同样的问题!

问题(正如iain所指出的)是Date::DATE_FORMATS[:long]"%B %e, %Y"。根据{{​​1}},%e会产生空白填充天数:

ri strftime

所以默认情况下,这是我在Rails 3.1.3中看到的:

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

奇怪的是,Rails对 > d = '2012-02-01'.to_date => Wed, 01 Feb 2012 > d.to_s(:long) => "February 1, 2012" 格式的:long格式使用了不同的日期格式(%d,其产生"01")与日期< / em>(%e,产生" 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"

解决方案然后在格式字符串中使用 "%-d" 而不是%e

> 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"

您只需将此行添加到新的初始值设定项config/initializers/date_formats.rb

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

如果您希望在Rails中更改此默认设置,请对https://github.com/rails/rails/pull/1994发表评论。

答案 2 :(得分:0)

对于它的价值,我宁愿使用"%-d"修复(甚至是"%-e"!它提供相同的结果)而不是".squish",这是特定于Rails的,而不是可移植的(如果你不想使用日期格式,为什么不使用Ruby-native ".squeeze",甚至".squeeze(' ')"呢?)。

此外,作为更新:@iain提到没有记录'%e'。值得的,it is now! (虽然有趣的是,不是"%-e"具体的,如果你尝试的话,它是有效的,并且有效!)