【问题标题】:Rails Unit TestRails 单元测试
【发布时间】:2011-07-21 16:43:14
【问题描述】:

请帮忙。我正在尝试为我的模型中的方法编写单元测试。它一直给我以下错误:

{ 1) 错误: test_Total_for_a_given_date_range_for_Campaigns(LetterTest): TypeError:无法将 ActiveSupport::Duration 转换为字符串 c:/Users/Kay/rails-app/CS5942/app/models/letter.rb:19:in +' c:/Users/Kay/rails-app/CS5942/app/models/letter.rb:19:intribe_total_on' test/unit/letter_test.rb:17:in `block in '}

这是我的测试文件中的内容:

test "Total for a given date range for Campaigns" do        
  end_date = (Date.today + 1.day).to_date.strftime('%Y-%m-%d')
  expected = Letter.where("letter_campaign_id = '1' and created_at between '#{ (Date.today - 1.day).to_date.strftime('%Y-%m-%d')}' and #{end_date}").count
  data = Letter.tribe_total_on( 1 , (Date.today - 1.day).to_date.strftime('%Y-%m-%d') , (Date.today).to_date.strftime('%Y-%m-%d'))

  assert_equal expected, data
end

加号好像有问题。如果我能找到解决方案,我会很高兴。谢谢。

这是tribe_total_on方法:

def self.tribe_total_on(tribe, start_date, end_date)
  #Letter.connection.execute("SELECT COUNT(id) FROM letters WHERE letter_campaign_id = #{tribe} AND created_at BETWEEN '#{start_date.to_date.strftime('%Y-%m-%d')}' and '#{end_date.to_date.strftime('%Y-%m-%d')}'")[0][0]
  end_date = end_date + 1.day #This is line 19 ...Had to include the one day to accomodate dates like 2011-06-05 01:02:03

  Letter.where("letter_campaign_id = #{tribe} AND created_at between ? and ?", start_date.to_date, end_date.to_date).count
end

【问题讨论】:

  • 它不是来自您的测试,而是来自您的 Letter 模型(如错误所示)。 letter.rb 的第 19 行是什么? (把整个tribe_total_on方法贴出来,指出哪一个是第19行)。
  • 谢谢..已经贴出方法

标签: ruby-on-rails-3 unit-testing


【解决方案1】:

打开 Rails 控制台并输入你想要做的事情,你会得到这个:

(Date.today).to_date.strftime('%Y-%m-%d') + 1.day TypeError:无法将 ActiveSupport::Duration 转换为字符串 来自 (irb):20:in `+'

您要么必须在将 strftime 传递给tribe_total_on 之前将其转换为 strftime,要么必须在调用 strftime 之前将日期加上 1.day,然后再将其传递给tribe_total_on。

所以:

(Date.today + 1.day).to_date.strftime('%Y-%m-%d')

或:

def self.tribe_total_on(tribe, start_date, end_date)
  end_date = (end_date + 1.day).to_date.strftime('%Y-%m-%d')

【讨论】:

  • 我已经尝试了代码,但它仍然给我错误,我怀疑它在方法中将 end_date 视为字符串而不是日期值。你怎么看?
  • 哦..非常感谢您的帮助....我像这样重写了它并且它有效.. end_date = ((end_date).to_date + 1.day).to_date.strftime ('%Y-%m-%d')
  • @Peter DeWeese...请是新手,我该怎么做?
  • 欢迎来到 SO!答案左侧有一个复选标记轮廓,您可以单击以选择最佳答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 2011-04-10
相关资源
最近更新 更多