我有一个步骤失败并出现以下问题......
expected #has_content?("July 4, 2009") to return true, got false
我认为问题在于“七月”和“4”之间的额外空间。我在步骤定义和视图中都使用了 published_on.to_s(:long) ,所以我不完全确定额外空间来自哪里。
有任何想法吗?
我有一个步骤失败并出现以下问题......
expected #has_content?("July 4, 2009") to return true, got false
我认为问题在于“七月”和“4”之间的额外空间。我在步骤定义和视图中都使用了 published_on.to_s(:long) ,所以我不完全确定额外空间来自哪里。
有任何想法吗?
当您尝试时会发生这种情况:
Date.civil(2010, 7, 4).strftime("%e") # => " 4"
Rails%e
以它们的:long
格式使用. 有趣的%e
是没有记录。
如果你不关心额外的空间(额外的空间不会在 HTML 中显示),我会调整我的步骤定义以匹配 Ruby 行为。如果您确实关心它,请压扁它:
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"
我今天在黄瓜测试中遇到了同样的问题!
问题(正如 iain 指出的那样)Date::DATE_FORMATS[:long]
是"%B %e, %Y"
. ,%e
根据ri strftime
,产生一个空白的天数:
%d - Day of the month, zero-padded (01..31)
%-d no-padded (1..31)
%e - Day of the month, blank-padded ( 1..31)
所以默认情况下,这是我在 Rails 3.1.3 中看到的:
> d = '2012-02-01'.to_date
=> Wed, 01 Feb 2012
> d.to_s(:long)
=> "February 1, 2012"
奇怪的是,Rails 对时间:long
格式(,产生)使用不同的日期格式(,产生):%d
"01"
%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发表评论。
对于它的价值,我宁愿使用"%-d"
修复(甚至"%-e"
! 给出相同的结果)而不是".squish"
Rails 特定的,而不是可移植的(为什么不使用 Ruby-native ".squeeze"
,或者甚至".squeeze(' ')"
在那时,如果你不想弄乱日期格式?)。
此外,作为更新:@iain 提到没有记录 '%e'。对于它的价值,它是现在!(虽然有趣的是,不是"%-e"
特别的,如果你尝试一下,它是有效的,并且有效!)