Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 测试方法是否命中数据库_Ruby On Rails_Ruby_Ruby On Rails 4_Rspec_Rspec Rails - Fatal编程技术网

Ruby on rails 测试方法是否命中数据库

Ruby on rails 测试方法是否命中数据库,ruby-on-rails,ruby,ruby-on-rails-4,rspec,rspec-rails,Ruby On Rails,Ruby,Ruby On Rails 4,Rspec,Rspec Rails,我有以下方法,我想确保它不会命中数据库,除非子域发生更改 class ApplicationController < ActionController::API def current_account unless @current_account && @current_account.subdomain == request.subdomain @current_account = Account.find_by subdomain: reque

我有以下方法,我想确保它不会命中数据库,除非子域发生更改

class ApplicationController < ActionController::API
  def current_account
    unless @current_account && @current_account.subdomain == request.subdomain
      @current_account = Account.find_by subdomain: request.subdomain
    end
    @current_account
  end
end

我尝试了
expect(Account)。接收(:find)
,但没有成功。

我通常为此安装此gem:

-用于数据库查询的RSpec匹配器

用法示例:

it 'does not make database queries' do
  expect { subject.make_no_queries }.to_not make_database_queries
end

我知道这很古老,但我只是在寻找答案,所以也许其他人会受益,因为我不需要宝石来满足我的需求

答案的要点是:如果您不需要计算实际的数据库查询或点击次数(我没有,看起来OP也没有),您可以使用它来检查是否正在调用运行数据库查询的方法。但是,在你运行你正在监视的方法之前,你必须先做一个间谍。语法是
allow(foo).接收(:bar)
expect(foo).接收(:bar)

所以OP的
expect(Account).to receive(:find)
不起作用的原因是因为它应该是:

如果子域没有更改,它“不会命中数据库”do
#刺探
允许(帐户)。接收(:查找)
获取:索引
#预计将达到db
期望(帐户)。收到_(:find)
获取:索引
#预计不会击中数据库
预期(帐户)。未收到(:find)
结束
如果需要,您可以变得更复杂,监视和统计特定的查询,因为您可以
expect(foo.).to have_received(:bar).with(*args).two
等。但是如果您使用ActiveRecord开箱即用,并且您的方法可以进行各种查询,我的猜测是,使用gem计算数据库命中率要比亲自查看源代码找出要监视的内容更容易

it 'does not make database queries' do
  expect { subject.make_no_queries }.to_not make_database_queries
end