Rails 3, как сбросить контроллер before_filters между спецификациями? - PullRequest
0 голосов
/ 09 февраля 2011

Я пишу спецификации для плагина, который имеет разные модули, которые пользователь может выбрать для загрузки.Некоторые из этих модулей динамически добавляют before_filters к ApplicationController.

Проблема иногда в том, что если спецификация для модуля X запускается и добавляет before_filter, то спецификация для модуля Y, которая запускается позже, завершится неудачей.Мне нужно как-то запустить вторую спецификацию на clean ApplicationController.

Есть ли способ удалить перед фильтрами или полностью перезагрузить ApplicationController между спецификациями?

Например, вследующие спецификации, второе «это» не проходит:

describe ApplicationController do
  context "with bf" do
    before(:all) do
      ApplicationController.class_eval do
        before_filter :bf

        def bf
          @text = "hi"
        end

        def index
          @text ||= ""
          @text += " world!"
          render :text => @text
        end
      end
    end

    it "should do" do
      get :index
      response.body.should == "hi world!"
    end
  end

  context "without bf" do
    it "should do" do
      get :index
      response.body.should == " world!"
    end
  end
end

Ответы [ 2 ]

0 голосов
/ 10 февраля 2011

Я бы использовал отдельные спецификации для подклассов, а не для самого ApplicationController:

# spec_helper.rb
def setup_index_action
  ApplicationController.class_eval do
    def index
      @text ||= ""
      @text += " world!"
      render :text => @text
    end
  end
end

def setup_before_filter
  ApplicationController.class_eval do
    before_filter :bf

    def bf
      @text = "hi"
    end
  end
end

# spec/controllers/foo_controller_spec.rb
require 'spec_helper'

describe FooController do

  context "with bf" do
    before(:all) do
      setup_index_action
      setup_before_filter
    end

    it "should do" do
      get :index
      response.body.should == "hi world!"
    end
  end
end


# spec/controllers/bar_controller_spec.rb
require 'spec_helper'

describe BarController do
  before(:all) do
    setup_index_action
  end

  context "without bf" do
    it "should do" do
      get :index
      response.body.should == " world!"
    end
  end
end
0 голосов
/ 09 февраля 2011

Вы должны быть в состоянии сделать это, используя контекстные блоки для разделения двух наборов примеров.

describe Something do
  context "with module X" do
    before(:each) do
      use_before_fitler
    end

    it_does_something
    it_does_something_else
  end

  context "without module X" do
    it_does_this
    it_does_that
  end
end

before_filter должно влиять только на примеры в контексте «with module X».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...