当必须设置方法时,如何测试我的ApplicationController?

时间:2016-01-28 02:26:02

标签: ruby-on-rails rspec

我正在使用rspec并且在尝试测试我的ApplicationController时遇到问题。

是否有可能以某种方式设置控制器内的值?这就是我现在所拥有的:

class ApplicationController < ActionController::Base
  include CurrentUser
  before_action :load_account


  private
   def load_user
      @account = current_user.account if current_user.present?
   end
end

包含的模块只添加一个返回User的current_user方法。

module CurrentUser
  def self.included(base)
    base.send :helper_method, :current_user
  end

  def current_user
    User.find_by(.....)  # returns a User object
  end
end

所以当我测试我的控制器时,我不需要测试current_user.rb的功能,我可以在运行测试之前以某种方式注入current_user的值吗?

示例控制器规范:

require 'rails_helper'

RSpec.describe ProductsController, type: :controller do
  it "...." do
    get :new
    expect(response.body).to eq("hello")
  end
end

但是目前任何期望current_user的控制器都会失败,因为它是nil。

1 个答案:

答案 0 :(得分:2)

你可以在之前设置一个自定义:在配置中的每个自定义current_user,以便它不会破坏你的测试

RSpec.configure do |config|
  config.before(:each, current_user_present: true) do
    account = double(:account)
    current_user = double(:current_user, account: account)
    expect(controller).to receive(:current_user).and_return(current_user)
    expect(current_user).to receive(:present?).and_return(true)
    expect(current_user).to receive(:account).and_return(account)
  end
end

RSpec.describe ProductsController, type: :controller, current_user_present: true do
  it "..." do
    #...
  end
end