Ruby on rails 在ActiveRecord单元测试中处理查询缓存是否重要?

Ruby on rails 在ActiveRecord单元测试中处理查询缓存是否重要?,ruby-on-rails,unit-testing,activerecord,query-cache,Ruby On Rails,Unit Testing,Activerecord,Query Cache,在Hibernate世界中,您经常可以让单元测试看起来通过了,但实际上有一些bug没有出现,因为您正在处理缓存数据。例如,您可以保存一个父级,而其子级认为它正在级联保存。如果在保存并测试子集合的大小后重新查询父集合,则看起来可以。但实际上Hibernate并没有保存子对象,而是缓存了父对象,所以您可以查看未保存的子对象。解决这个问题的一种方法是清除save和查询之间的会话缓存,以便知道数据直接来自数据库 这是ActiveRecord的问题吗?如果我保存一个模型,然后在同一个测试中查询它,是否可能

在Hibernate世界中,您经常可以让单元测试看起来通过了,但实际上有一些bug没有出现,因为您正在处理缓存数据。例如,您可以保存一个父级,而其子级认为它正在级联保存。如果在保存并测试子集合的大小后重新查询父集合,则看起来可以。但实际上Hibernate并没有保存子对象,而是缓存了父对象,所以您可以查看未保存的子对象。解决这个问题的一种方法是清除save和查询之间的会话缓存,以便知道数据直接来自数据库


这是ActiveRecord的问题吗?如果我保存一个模型,然后在同一个测试中查询它,是否可能不是从数据库而是从查询缓存中获取数据?我没有看到任何样本测试试图处理这个问题,所以我想知道是否有什么东西使它成为一个非问题?

我从来没有在ActiveRecord中遇到过这个问题。我的理解是,缓存只在读取时进行,因此总是执行保存。

我从来没有在ActiveRecord中遇到过这个问题。我的理解是,缓存仅在读取时进行,因此总是执行保存。

是。根据您编写测试的方式,Rails查询缓存有时会产生干扰。有时,rails足够智能,可以跟踪何时需要清除缓存(当对象之间存在明显关联时),但下面的示例并不符合预期:

user.posts.should == []
Post.create(:user_id => user.id)
user.posts.size.should_not == [] # Fails, since the original query was cached.
通常,如果在同一测试中执行同一查询两次,则应在尝试执行第二个查询之前调用.reload。像这样:

user.posts.should == []
Post.create(:user_id => user.id)
user.posts.reload
user.posts.size.should_not == []
在我个人的经验中,最好考虑一种不同的写作方式,而不是使用上面的方法。例如,这里有一种更好的编写上述内容的方法,它不会受到查询缓存的影响:


lambda{Post.create(:user\u id=>user.id)}。应更改(user.posts,:count)。按(1)
是。根据您编写测试的方式,Rails查询缓存有时会产生干扰。有时,rails足够智能,可以跟踪何时需要清除缓存(当对象之间存在明显关联时),但下面的示例并不符合预期:

user.posts.should == []
Post.create(:user_id => user.id)
user.posts.size.should_not == [] # Fails, since the original query was cached.
通常,如果在同一测试中执行同一查询两次,则应在尝试执行第二个查询之前调用.reload。像这样:

user.posts.should == []
Post.create(:user_id => user.id)
user.posts.reload
user.posts.size.should_not == []
在我个人的经验中,最好考虑一种不同的写作方式,而不是使用上面的方法。例如,这里有一种更好的编写上述内容的方法,它不会受到查询缓存的影响:

lambda{Post.create(:user\u id=>user.id)}。应更改(user.posts,:count)。按(1)