[英]RSpec / Rails - How do I test that a method in ApplicationController is called (when I'm testing a subclassed controller)?
[英]How to test my ApplicationController, when a method has to be setup?
我正在使用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
包含的模块仅添加了一个current_user方法,该方法返回一个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。
您可以在配置中的:each之前设置一个自定义,以对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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.