如何在测试中禁用Active Record Query Caching?或者使用更加智能的重装?

时间:2011-09-02 23:38:55

标签: ruby-on-rails caching activerecord

我最近在使用似乎是查询缓存的测试中遇到了很多麻烦。

许多变量似乎没有我认为的值,我发现我必须使用'重载'。现在我经常使用'reload'方式来确保我拥有db中的最新数据。

我应该何时使用'reload',还是应该完全禁用缓存?

例如,在我的一个测试中,这一行在没有'reload'位的情况下将无效:

assert_equal @ fl1.reload.orig_price,@ fl1.lesson.reload.price #price在之前重置

我开始对传球测试失去信心,因为这也是,思考,是的,但是如果它因为过时的价值而过去了。

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:-1)

基本上,如果你只在内存中工作,则不需要使用reload。如果您直接访问数据库,则需要。

所以,一般来说,如:

@user = User.create!(:name => "John Doe", :age => 100, :login => "jdoe")
assert_equal "John Doe", @user.name

这样可以正常工作,因为该对象的所有内容都在内存中。

现在,让我们说你做了类似的事情:

@user.pictures << Picture.create!(:locn => "/images/my_image.jpg")
assert @user.contains_picture(/images/"my_image.jpg")

该方法contains_pictureuser.rb中定义为:

def contains_picture(path)
    User.includes(:picture).where("pictures.locn = ?", path)
end

因为该方法直接进入数据库,所以它会失败,因为它找不到该图片。相反,在将图片添加到.pictures集合后,您需要执行@user.save!

因此,它取决于对象发生了什么以及使用的方法是什么样的,这将告诉您是否需要reload