2011-07-21 120 views
1

我试图做一个单元测试,以确保某些操作确实/不要查询数据库。有什么方法可以查看查询,或者我可以查看最糟糕的一些计数器?如何在单元测试中检查Rails记录缓存?

+0

您是试图测试钢轨的缓存,还是您有一堆您想要手动缓存的自定义SQL? –

+0

Rails的缓存。具体来说,我有几个函数试图智能地使用缓存数据(x.loaded?检查),并且想要可靠地执行这两个代码路径,*和*确保它们不会触及数据库。 – Groxx

回答

2

如果您的意图是要辨别Rails(ActiveRecord)是否实际缓存查询,那么您不必为这些元素编写单元测试,它们都是Rails本身的一部分。

编辑:

在这种情况下,我可能会看看我是否能适应轨道团队使用测试的ActiveRecord本身的策略之一。从我上面的链接检查以下测试:

def test_middleware_caches 
    mw = ActiveRecord::QueryCache.new lambda { |env| 
    Task.find 1 
    Task.find 1 
    assert_equal 1, ActiveRecord::Base.connection.query_cache.length 
    } 
    mw.call({}) 
end 

您可以做类似如下:

def check_number_of_queries 
    mw = ActiveRecord::QueryCache.new lambda { |env| 
    # Assuming this object is set up to perform all its operations already 
    MyObject.first.do_something_and_perform_side_operations 
    puts ActiveRecord::Base.connection.query_cache.length.to_s 
    } 
end 

我没有尝试过这样的事情,但它可能是值得进一步调查。如果上面实际上返回了等待发生的缓存查询的数量,那么为您的测试用例更改puts为断言应该是微不足道的。

+0

我的目的是识别单个顶级操作是否与数据库有效地通信。如果我“x.do_something_and_perform_side_operations_like_emailing_and_a_dozen_other_things”,我希望能够判断它是否在没有读取日志的情况下触发10个查询或10,000个查询。 – Groxx

+0

是的,我开始浏览并找到他们的“ActiveRecord :: SQLCounter”类。他们正在捕获日志信息(在编写之前,他们实际上并没有篡改日志,但仍然)。 Nuttery。感谢您的链接+额外的信息! – Groxx