使用Ruby / Rails获得了一些单元测试正则表达式问题。
运行:
编写一个applicaton_helper
方法,该方法将根据日期的距离格式化日期。这是方法:
module ApplicationHelper
def humanize_datetime time
time = Time.at(time)
date = time.to_date
today = Date.today
time_format = "%-I:%M %p"
#if the time is within today, we simply use the time
if date == today
time.strftime time_format
# if the time is within the week, we show day of the week and the time
elsif today - date < 7
time.strftime "%a #{time_format}"
# if time falls before this week, we should the date (e.g. Oct 30)
else
time.strftime "%b %e"
end
end
end
这似乎给出了预期的结果,但由于某种原因,以下测试失败了:
require 'test_helper'
class ApplicationHelperTest < ActionView::TestCase
test "humanize_dateime should display only time when datetime is within today" do
formatted = humanize_datetime Time.now
assert_match /\A\d{1,2}\:\d\d (AM|PM)\z/, formatted
end
test "humanize_datetime should display day of week and time when datetime is not today but within week" do
yesterday_formatted = humanize_datetime (Date.today - 1).to_time # yesterday
assert_match /\A[a-zA-z]{3} \d{1,2}\:\d\d (AM|PM)\z/, yesterday_formatted
within_week_formatted = humanize_datetime (Date.today - 6).to_time # just within this week
assert_match /\A[a-zA-z]{3} \d{1,2}\:\d\d (AM|PM)\z/, within_week_formatted
end
test "humanize_datetime should display date when datetime is before this week" do
last_week_formatted = humanize_datetime (Date.today - 7).to_time
assert_match /\A[a-zA-Z]{3} \d{1,2}\z/, last_week_formatted
end
end
最后一次测试失败,给出了
1)失败: ApplicationHelperTest#test_humanize_datetime_should_display_date_when_datetime_is_before_this_week [/Users/mohammad/rails_projects/stopsmoking/test/helpers/application_helper_test.rb:20]: 预期/ \ A [a-zA-Z] {3} \ d {1,2} \ z /匹配“Oct 8”。
鉴于正则表达式看起来不错,我已经在http://rubular.com/上测试了表达式,这真的很棒。这里的所有其他测试都在通过。我还尝试在\d
之后删除字符串分隔符的开头/结尾和量词。
有关为何发生这种情况的任何想法?
答案 0 :(得分:2)
如果日期为&lt; humanize_datetime
,则"%b %e"
会增加额外的空间10,因为"Oct 8"
。结果字符串不是"Oct 8"
,而是"%b %-d"
。
您应该使用{{1}}或更改正则表达式。
编辑:减去前缀可能不适用于所有系统,有关详细信息,请参阅this答案。