Rails / Rspec: наличие анонимного контроллера определенного класса - PullRequest
0 голосов
/ 30 ноября 2018

Мои контроллеры наследуют действия от ApplicationController.Моя цель - протестировать поведение любого контроллера, который наследуется от ApplicationController.Я создал RandomController в своих спецификациях для достижения этой цели.

Вот моя спецификация на данный момент

require 'rails_helper'

RSpec.configure do |c|   
  c.infer_base_class_for_anonymous_controllers = false
end

class RandomController < ApplicationController; end
class Random < ApplicationRecord; end

RSpec.describe RandomController, type: :controller do
  controller {}

  describe '.index' do
    context 'when no record exists' do
      before { get :index }

      specify { should respond_with(200) }
    end
  end
end

Здесь application_controller

class ApplicationController
  def index
    binding.pry
  end
end

Проблема в том, что при запуске метода index self.class возвращает #<Class:0x00007f8c33b56fc8> вместо RandomController.Возможно ли, чтобы мой анонимный контроллер был экземпляром данного контроллера (объявленного в спецификации)?

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Попробуйте использовать shared_context вместо создания RandomController для проверки общего кода:

shared_context 'an application controller' do
  describe '#index' do
    context 'when no record exists' do
      before { get :index }
      expect(response).to have_http_status(:ok)
    end
  end
end

Обычно этот файл помещается в /spec/support.Пример:

/spec/support/shared_contexts_for_application_controllers.rb

Затем в каждом контроллере, который наследуется от ApplicationController:

describe RandomController do
  include_context 'an application controller'
end
0 голосов
/ 30 ноября 2018

В соответствии с документацией вы можете указать базовый класс для анонимного контроллера:

Чтобы указать другой базовый класс, вы можете явно передать класс методу контроллера:

controller(BaseController)

https://relishapp.com/rspec/rspec-rails/docs/controller-specs/anonymous-controller

Таким образом, вы, вероятно, можете позвонить:

controller(RandomController)

в ваших спецификациях

...