如何使用 RSpec 在 rails 中的 ApplicationController 操作之前进行测试
How to test before action of ApplicationController in rails using RSpec
我的 ApplicationController 看起来像这样
class ApplicationController < ActionController::Base
before_action :initialize_fields
protected
def initialize_fields
@company_id_super = nil
@show_company_super = 0
@round_id_super = nil
if(params["controller"] == 'companies')
if(params["id"].present?)
@company_id_super = params["id"]
end
else
if(params["company_id"].present?)
@company_id_super = params["company_id"]
end
end
if(@company_id_super != nil)
@show_company_super = 1
@company_super = Company.find(@company_id_super)
else
@company_super = nil
end
if(params["controller"] == 'home' || params[:controller] == 'votes')
@hide_side_bar = 1
else
@hide_side_bar = 0
end
if(params["controller"] == 'rounds')
if(params["id"].present?)
@round_id_super = params["id"]
end
end
end
end
我的控制器规格之一如下所示
require 'rails_helper'
RSpec.describe OptionsController, type: :controller do
describe 'Options controller request specs' do
login_user
context 'GET #index' do
it 'should success and render to index page' do
contact = create(:option)
get :index, params: { company_id: 1 }
assigns(:options).should eq([option])
end
end
context 'GET #show' do
let!(:option) { create :option }
it 'should success and render to edit page' do
get :show, params: { id: option.id, company_id: 1 }
expect(response).to render_template :edit
end
end
end
end
现在的问题是当我 运行 这个规范时我得到以下错误:
Failure/Error: @company_super = Company.find(@company_id_super)
ActiveRecord::RecordNotFound:
Couldn't find Company with 'id'=1
# ./app/controllers/application_controller.rb:36:in `initialize_fields'
现在我知道问题出在应用程序控制器中,但我不知道如何解决它。我刚开始学习测试,有人可以帮助我吗?谢谢!
在发送请求之前使用 FactoryBot
创建 Company
记录。
在你的 spec/factories/companies.rb:
FactoryBot.define do
factory :company do
name 'My Company'
.
.
end
end
在你的 spec/controllers/options_spec.rb
RSpec.describe OptionsController, type: :controller do
let(:my_company) { FactoryBot.create(:company) }
describe 'Options controller request specs' do
login_user
context 'GET #index' do
it 'should success and render to index page' do
contact = create(:option)
get :index, params: { company_id: my_company.id } #<--- This will create the company record and pass its ID
assigns(:options).should eq([option])
end
end
end
end
end
所以现在,在您的 initialize_fields
中,您将在数据库中找到公司记录并消除错误。
我的 ApplicationController 看起来像这样
class ApplicationController < ActionController::Base
before_action :initialize_fields
protected
def initialize_fields
@company_id_super = nil
@show_company_super = 0
@round_id_super = nil
if(params["controller"] == 'companies')
if(params["id"].present?)
@company_id_super = params["id"]
end
else
if(params["company_id"].present?)
@company_id_super = params["company_id"]
end
end
if(@company_id_super != nil)
@show_company_super = 1
@company_super = Company.find(@company_id_super)
else
@company_super = nil
end
if(params["controller"] == 'home' || params[:controller] == 'votes')
@hide_side_bar = 1
else
@hide_side_bar = 0
end
if(params["controller"] == 'rounds')
if(params["id"].present?)
@round_id_super = params["id"]
end
end
end
end
我的控制器规格之一如下所示
require 'rails_helper'
RSpec.describe OptionsController, type: :controller do
describe 'Options controller request specs' do
login_user
context 'GET #index' do
it 'should success and render to index page' do
contact = create(:option)
get :index, params: { company_id: 1 }
assigns(:options).should eq([option])
end
end
context 'GET #show' do
let!(:option) { create :option }
it 'should success and render to edit page' do
get :show, params: { id: option.id, company_id: 1 }
expect(response).to render_template :edit
end
end
end
end
现在的问题是当我 运行 这个规范时我得到以下错误:
Failure/Error: @company_super = Company.find(@company_id_super)
ActiveRecord::RecordNotFound:
Couldn't find Company with 'id'=1
# ./app/controllers/application_controller.rb:36:in `initialize_fields'
现在我知道问题出在应用程序控制器中,但我不知道如何解决它。我刚开始学习测试,有人可以帮助我吗?谢谢!
在发送请求之前使用 FactoryBot
创建 Company
记录。
在你的 spec/factories/companies.rb:
FactoryBot.define do
factory :company do
name 'My Company'
.
.
end
end
在你的 spec/controllers/options_spec.rb
RSpec.describe OptionsController, type: :controller do
let(:my_company) { FactoryBot.create(:company) }
describe 'Options controller request specs' do
login_user
context 'GET #index' do
it 'should success and render to index page' do
contact = create(:option)
get :index, params: { company_id: my_company.id } #<--- This will create the company record and pass its ID
assigns(:options).should eq([option])
end
end
end
end
end
所以现在,在您的 initialize_fields
中,您将在数据库中找到公司记录并消除错误。