ruby-on-rails - 命名范围的 RSpec 和 stub 参数

标签 ruby-on-rails rspec

我尝试为依赖于日期的命名范围编写规范。

规范:

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')

即它似乎忽略了我的 stub 日期方法。

但是,如果我使用类方法而不是命名范围,那么它会通过:

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永远不会被直接调用。

最佳答案

我认为问题在于 Date.today 不是在运行时计算的,而是在 Rails 首次读取模型时计算的。尝试将其包含在 lambda 中:

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

关于ruby-on-rails - 命名范围的 RSpec 和 stub 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2814315/

相关文章:

ruby-on-rails - 正确显示保存到数据库中的图像作为 blob

sql - 在rails或sql中克服 "ActiveRecord::StatementInvalid: PG::AmbiguousFunction"的方法。 (st_intersects 不是唯一的函数名称)

ruby - Bundler 找不到 rake,但它似乎已安装

ruby - 在没有机架的情况下运行 Capybara 在使用 url 参数时会产生错误

ruby - Rspec:有没有办法在 before(:each) block 之后但在实际的 it block 之前执行代码?

ruby-on-rails - 添加字段以设计用户注册

javascript - Rails jQuery 无页问题

ruby-on-rails - 使用 secure_random stub rspec 中的随机值

ruby-on-rails - 是否有使用 ActiveResource 和 XMLRPC for Rails 的示例?

ruby-on-rails - Rspec + Capybara - Paypal Express 沙盒结帐时间