2016-10-19 3 views
0

Пожалуйста, медведь со мной, пока я даю некоторый фон на мой вопрос:Принудительно Single Rails контроллер действия Инвокации из RSpec примера

Я недавно был интегрирующим канкан в наше приложение и обнаружил, что один из тестов контроллера RSpec не удался. Оказывается, это было результатом плохого написания теста и одновременного вызова действия на контроллере.

it 'only assigns users for the organisation as @users' do 
    xhr :get, :users, { id: first_organisation.to_param} 
    expect(assigns(:users).count).to eq(3) 

    xhr :get, :users, { id: second_organisation.to_param} 
    expect(assigns(:users).count).to eq(4) 
    end 

Примечание: пример сокращен для краткости.

Теперь причина этого не в том, что rspec использует один и тот же экземпляр контроллера для обоих вызовов действий, и CanCan загружает только ресурс организации, если он еще не загружен.

Я могу принять аргументацию за a) rspec, используя один экземпляр контроллера для области действия примера, и b) для CanCan будет только загрузка ресурса, если он не существует.

Настоящая проблема заключается в том, что, конечно, это плохая идея, чтобы вызывать действие дважды в одном примере. Теперь введение CanCan выявило ошибку в этом примере, но теперь я обеспокоен тем, что могут быть другие тесты контроллера, которые также вызывают действия дважды или что такие примеры могут быть написаны в будущем, что довольно долго наводит меня на мой вопрос:

Возможно ли, что пример rspec контроллера может вызывать только одно действие контроллера?

ответ

0

Хорошо, действительно кажется, у меня есть решение:

Создать unity_helper.rb перейти в спецификации/поддержки

module UnityExtension 
    class UnityException < StandardError 
    end 

    def check_unity 
    if @unity 
     raise UnityException, message: 'Example is not a unit test!' 
    end 

    @unity = true 
    end 
end 

RSpec.configure do |config| 
    config.before(:all, type: :controller) do 
    ApplicationController.prepend UnityExtension 
    ApplicationController.prepend_before_action :check_unity 
    end 
end 

затем в rails_helper.rb

require 'support/unity_helper' 

И это фактически выделил другой пример контроллера rspec, который дважды вызывает контроллер.

Я открыт для других решений или улучшений для моей работы.

Смежные вопросы