Как проверить действие ApplicationController в рельсах перед использованием RSpec - PullRequest
0 голосов
/ 09 января 2019

Мой 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'

Теперь я знаю, что проблема в контроллере приложения, но я не знаю, как это исправить. Я только начал изучать тесты, кто-нибудь может мне помочь с этим? Спасибо!

1 Ответ

0 голосов
/ 09 января 2019

Создайте запись Company, используя FactoryBot перед отправкой запроса.

В вашей спецификации / фабрики / компании.rb:

FactoryBot.define do
  factory :company do
    name 'My Company'
    .
    .
  end
end

В вашей спецификации / 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 вы найдете запись о компании в базе данных и избавите вас от ошибки.

...