RSpec如何在另一个方法中模拟方法

时间:2019-11-08 15:16:19

标签: ruby-on-rails ruby rspec

application_controller中,我有两种方法要在maintenance_mode_controller_specs中进行测试。如何创建模拟maintenance_mode_active?并返回false以在check_maintenance?中使用它?

application_controller.rb     before_action:check_maintenance?

private

def check_maintenance?
  if maintenance_mode_active? == true
    redirect_to maintenance_mode
  elsif request.fullpath.include?(maintenance_mode_path)
    redirect_to :root
  end
end

def maintenance_mode_active?
  # do sth ...
  mode.active?
end

maintenance_mode_controller_spec.rb

context 'when maintenance mode is active' do
  let(:maintenance_mode?) { instance_double(ApplicationController) }

  before do
    allow(ApplicationController).to receive(:maintenance_mode_active?).and_return(false)
  end

  it 'redirect to root path' do
    expect(described_class).should redirect_to(maintenance_mode_path)
  end
end

1 个答案:

答案 0 :(得分:1)

maintenance_mode_active是一个实例方法,您可以在类级别上对其进行存根。您需要使用allow_any_instance_of

before do
  allow_any_instance_of(ApplicationController).to receive(:maintenance_mode_active?).and_return(false)
end