【问题标题】:Rails Testing a named_scope with a date rangeRails 使用日期范围测试 named_scope
【发布时间】:2012-08-30 19:23:17
【问题描述】:

场景
我在名为“last_week”的模型上有一个 named_scope。它所做的只是获取上周的记录。

我想对此进行测试,我的方法是测试返回的结果是否在一定范围内。我不知道这是否是在类方法上测试此功能的正确方法。

我无法使用 RSpec、Shouda 或其他第 3 方客户端插件。如果我愿意,我只能使用 Mocha。

# Model

class Article < ActiveRecord::Base

  scope :last_week,   :conditions => { :created_at => 1.week.ago..DateTime.now.end_of_day }

end


#Test

class ArticleTest < ActiveSupport::TestCase

  test "named scope :last_week " do
    last_week_range = DateTime.now.end_of_day.to_i - 1.week.ago.to_i
    assert_in_delta last_week_range, Article.last_week.first.created_at - Article.last_week.last.created_at,  last_week_range
  end

end

寻求有关此方法正确或错误的反馈。

【问题讨论】:

    标签: ruby-on-rails ruby unit-testing named-scope testcase


    【解决方案1】:

    首先您的范围是错误的:因为代码是动态执行的,您的日期范围条件将取决于您启动服务器的时间...

    替换为:

    scope :last_week,  lambda { :conditions => { :created_at => 1.week.ago..DateTime.now.end_of_day } }
    

    其次,为了测试,我会创建一些记录并检查范围是否正确:

    • 创建工厂

    • 创建两条记录

    • 设置created_at 1 周 + 1 天前的一条记录

    • 检查您的范围仅检索一个(正确的)

    【讨论】:

    • 1.感谢您指出 lambda 提示 2。所以我正在使用固定装置,并且在我的固定装置中,我知道 3 条记录在 :last_week 范围内。这样写测试不好吗test "scope :last_week" do assert_equal 3, Article.last_week.count end
    • Fixtires 不是动态的(除非您在里面添加 ruby​​ 代码),您的测试下周将失败 + 您必须始终检查您的代码是否符合您的预期(在时间范围内查找条目)并拒绝错误值(在时间范围之外找不到条目)
    • 我在固定装置中有一些 ruby​​ 代码,以使 created_at 的日期显示为动态:。我想我想知道我是否可以单独使用固定装置完成您提到的操作,或者我是否需要研究像 FactoryGirl 这样的第 3 方插件?
    • 确保在测试期间使用像 Timecop 这样的 gem 来冻结时间,否则您的自动化测试框架会出现一些奇怪的故障,因为测试正好在午夜运行。
    猜你喜欢
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    • 2014-05-19
    • 2016-10-22
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多