0

我有一个步骤失败并出现以下问题......

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

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

有任何想法吗?

4

3 回答 3

2

当您尝试时会发生这种情况:

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" 
于 2010-12-12T11:56:18.030 回答
0

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

问题(正如 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发表评论。

于 2012-02-01T00:22:40.393 回答
0

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

此外,作为更新:@iain 提到没有记录 '%e'。对于它的价值,它是现在!(虽然有趣的是,不是"%-e"特别的,如果你尝试一下,它是有效的,并且有效!)

于 2013-05-01T14:20:55.550 回答