我的步骤因以下内容而失败...
expected #has_content?("July 4, 2009") to return true, got false
我认为问题是“七月”和“四号”之间的额外空间。我在步骤定义和视图中都使用了published_on.to_s(:long),所以我不完全确定额外空间的来源。
有什么想法吗?
答案 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"
具体的,如果你尝试的话,它是有效的,并且有效!)