2011-10-31 81 views
1

我有這樣的範圍Rails的:我想存根Time.now但它不會在範圍存根

scope :old, joins(:group).where("`users`.`created_at` <= 
     DATE_SUB(?, INTERVAL `groups`.`check_minutes` MINUTE)", Time.now) 

我存根Time.now如下

Time.stub!(:now).and_return(Time.parse("1 JUL 2010")) 

我想範圍old使用這被刨了Time.now,但它使用當前時間。

我想在第一次加載模型時(例如,當加載spec_helper.rb時)rails會創建示波器,因此我們在加載示波器後存根Time.now。這是真的嗎?

於是我發現了兩個解決方案:

  1. 刷新用戶模型磕碰Time.now後這樣

使用

  • 使用常規方法,而不是存根範圍之前,你有更優雅解決方案?

  • +0

    http://railscasts.com/episodes/276-testing-time-web-requests – apneadiving

    回答

    4

    在普通範圍內有Time.now是不合需要的,因爲您聲明範圍是在加載模型類時設置的,因此長時間運行的Rails進程可能具有幾小時或幾天前的範圍。殘留問題是這種不良情況的副作用。

    我建議你用lambda重寫你的範圍,這樣總是會查詢Time.now。這將緩解存根問題並始終獲得最新的Time.now

    scope :old, lambda { joins(:group).where("`users`.`created_at` <= 
         DATE_SUB(?, INTERVAL `groups`.`check_minutes` MINUTE)", Time.now) } 
    

    我不是這裏的lambda語法的巨大粉絲,但它確實做了這項工作。

    +0

    謝謝!我決定使用'def old ... end'。 – petRUShka