2013-10-15 140 views
2

Ruby/Rails获得了一些单元测试正则表达式问题。Ruby on Rails单元测试日期测试失败

运行:

  • 的Rails 4.0.0
  • 的Ruby 2.0.0-P247
  • RVM 1.23.5
  • 的Mac OSX 10.8.5

写一个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-zA-Z] {3} \ d {1,2} \ z/to匹配“10月8日”。

考虑到正则表达式对我来说很合适,并且我已经在http://rubular.com/上测试了表达式,这真是非常棒。这里所有其他的测试都通过了。我也尝试在\d之后删除字符串分隔符和量词的开始/结尾。

有关为什么会发生这种情况的任何想法?

+0

我在3.2和4.0中测试了你的代码,它工作正常。你的正则表达式很好。别的东西坏了...... –

回答

2

如果月份的日期为< 10,由于"%b %e",您的humanize_datetime会增加额外的空间。结果字符串不是"Oct 8",而是"Oct  8"

您应该使用"%b %-d"或更改您的正则表达式。

编辑:减号前缀可能无法在所有系统上使用,有关更多详细信息,请参阅this答案。

+1

太棒了。解决了。所以这就是“空白填充”的Ruby文档的意思。太棒了,谢谢你。 –