我想测试某个代码段执行的SQL查询越少越好。
ActiveRecord::TestCase似乎有其自己的assert_queries方法,它将做到这一点。但是由于我没有修补ActiveRecord,所以对我来说没什么用。
ActiveRecord::TestCase
assert_queries
RSpec或ActiveRecord是否提供任何官方的公开方式来计算在代码块中执行的SQL查询的数量?
我认为您通过提及回答了您自己的问题assert_queries,但是这里有:
我建议您看一下后面的代码,assert_queries并使用它来构建自己的方法,该方法可用于计算查询。这里涉及的主要魔术是这一行:
ActiveSupport::Notifications.subscribe('sql.active_record', SQLCounter.new)
今天早晨,我有点麻烦了,并且删除了ActiveRecord进行查询计数的部分,并提出了以下建议:
module ActiveRecord class QueryCounter cattr_accessor :query_count do 0 end IGNORED_SQL = [/^PRAGMA (?!(table_info))/, /^SELECT currval/, /^SELECT CAST/, /^SELECT @@IDENTITY/, /^SELECT @@ROWCOUNT/, /^SAVEPOINT/, /^ROLLBACK TO SAVEPOINT/, /^RELEASE SAVEPOINT/, /^SHOW max_identifier_length/] def call(name, start, finish, message_id, values) # FIXME: this seems bad. we should probably have a better way to indicate # the query was cached unless 'CACHE' == values[:name] self.class.query_count += 1 unless IGNORED_SQL.any? { |r| values[:sql] =~ r } end end end end ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new) module ActiveRecord class Base def self.count_queries(&block) ActiveRecord::QueryCounter.query_count = 0 yield ActiveRecord::QueryCounter.query_count end end end
您将可以在ActiveRecord::Base.count_queries任何地方引用该方法。向其传递一个运行查询的块,它将返回已执行的查询数:
ActiveRecord::Base.count_queries
ActiveRecord::Base.count_queries do Ticket.first end
为我返回“ 1”。要使此工作正常进行,请执行以下操作:将其放在以下位置的文件中,lib/active_record/query_counter.rb并在文件中要求它config/application.rb:
lib/active_record/query_counter.rb
config/application.rb
require 'active_record/query_counter'
嘿!
可能需要一些解释。当我们调用此行时:
ActiveSupport::Notifications.subscribe('sql.active_record', ActiveRecord::QueryCounter.new)
我们了解了Rails 3的小通知框架。这是对Rails的最新主要版本的一个鲜亮的补充,没人真正知道。它允许我们使用subscribe方法在Rails中订阅事件通知。我们传入要订阅的事件作为第一个参数,然后将任何响应的对象call作为第二个参数。
subscribe
call
在这种情况下,当执行查询时,我们的小查询计数器将按照应尽的方式递增ActiveRecord :: QueryCounter.query_count变量,但仅适用于 实际 查询。
无论如何,这很有趣。希望对您有用。