Как проверить, добавляет ли модуль метод before_filter при включении классом контроллера - PullRequest
3 голосов
/ 10 ноября 2010

Мне интересно, как бы вы решили эту задачу

Вы хотите выполнить рефакторинг следующего кода

class AController < ActionController::Base
  before_filter :the_method

protected
  def the_method
  end 
end

в

class AController < ActionController::Base
  include TheModule
end

, но вы - энтузиаст BDD, вы должны сначала написать спецификацию

describe TheModule do
  context "when included" do
    it "adds #the_method as a before_filter" do

      # insert your code here

    end
  end
end

Другими словами, вопрос заключается в следующем: как написать спецификацию, которая проверяет, добавляется ли TheModel # the_method в качестве before_filter при включении в класс (предположительно, класс контроллера)).

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Я сделал это так:

describe TheModule do
  context "when included" do
    it "adds #the_method as a before_filter" do
      instance = Object.new
      instance.class_eval do |klass|
        expects(:before_filter).with(:expensive_method)
        include TheModule
      end
    end
  end
end

Так как нам не нужно проверять поведение фильтра до. Мы можем просто проверить, правильно ли он был выполнен.

1 голос
/ 10 ноября 2010

Хорошо, вы можете проверить наличие метода, который вызывает обратный вызов, как таковой.

@model.methods.include?('before_callback_method_name')

Однако это просто проверяет, присутствует ли метод, который выполняет обратный вызов, а не его специфический тип.

Я не могу найти способ получить список обратных вызовов для модели.

Единственным вариантом будет проверить, что модель делает так, как предполагалось, при наличии обратного вызова, т.е. если обратный вызов меняет строкупри обновлении проверьте, что строка обновляется при обновлении.

* РЕДАКТИРОВАТЬ *

Вы можете получить список обратных вызовов, например, так:

@u._validate_callbacks

Возвращает цепочку обратного вызова, которая включает в себя имена и, что важно, тип.

>> u._validate_callbacks.first.class
=> ActiveSupport::Callbacks::Callback
>> u._validate_callbacks.first.kind
=> :before
>> u._validate_callbacks.first.filter
=> :validate_associated_records_for_sites

Должна быть в состоянии точно проверить, загружен ли он сейчас.

...