RSpec и параметры заглушки для именованной области - PullRequest
2 голосов
/ 12 мая 2010

Я пытаюсь написать спецификацию для именованной области, которая зависит от даты.

Спецификация:

it "should return 6 months of documents" do
    Date.stub!(:today).and_return(Date.new(2005, 03, 03))
    doc_1 = Factory.create(:document, :date => '2005-01-01')
    Document.past_six_months.should == [doc_1]
end

Именованная область действия в модели документа:

named_scope :past_six_months,
  :conditions => ['date > ? AND date < ?', Date.today - 6.months, Date.today]

Спецификация не работает с пустым массивом, и запрос в test.log показывает, почему:

SELECT * FROM "documents" WHERE (date > '2009-11-11' AND date < '2010-05-11')

т.е. похоже, он игнорирует мой метод Date.

Однако, если я использую метод класса вместо именованной области видимости, тогда он передает:

def self.past_six_months
    find(:all, :conditions => ['date > ? AND date < ?', Date.today - 6.months, Date.today])
end

Я бы предпочел использовать подход именованной области, но я не понимаю, почему он не работает.

===

В ответ на @speicher:

Спасибо, но Timecop здесь не помогает.

it "should return 6 months of documents" do
    d = Date.new(2005, 03, 01)
    Timecop.travel(d)
    doc_1 = Factory.create(:document, :date => '2005-01-01')
    Document.past_six_months.should == [doc_1]
end

Все еще проходит для подхода метода класса, но не для именованной области.

Я подозреваю, что named_scope выполняет какие-то манипуляции с переданными условиями перед их фактической оценкой, то есть Date.today никогда не вызывается напрямую.

Ответы [ 2 ]

4 голосов
/ 12 мая 2010

Я думаю, что проблема в том, что Date.today вычисляется не во время выполнения, а когда модель впервые читается рельсами. Попробуйте заключить его в лямбду:

named_scope :past_six_months, lambda { {:conditions => ['date > ? AND date < ?', Date.today - 6.months, Date.today] } }
1 голос
/ 12 мая 2010

Избавьте себя от головной боли и используйте камень Timecop , чтобы подделать дату или время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...