Как регистрировать фильтры контроллера рельсов во время тестов контроллера rspec - PullRequest
4 голосов
/ 10 февраля 2011

Скажем, у меня есть контроллер со многими фильтрами до. В тесте контроллера код никогда не попадает в метод #create, хотя в спецификации, которую я публикую, создаю. В моем случае это было то, что

before_filter: user_signed_in

не проверял, но в журнале испытаний это не указывалось, поэтому мне пришлось выяснить это путем включения / выключения всех фильтров по очереди. Можно ли заставить Rails вести подробное ведение журнала, поскольку он обрабатывает каждый фильтр по очереди и выводит его в журнал испытаний?

Ответы [ 2 ]

5 голосов
/ 14 апреля 2011

Вот как я решил ту же проблему. Я уверен, что приведенный ниже код все еще можно улучшить и, возможно, поместить в собственный модуль. Улучшения wellcome.

Вам потребуется поместить следующий код в верхний ActionController, который обычно является ApplicationController или каким-либо контроллером, который вы хотите отслеживать:

class ApplicationController < ActionController::Base

  def self.before_filter_with_logging(*arguments, &block)
    filters, conditions =
      ActionController::Filters::FilterChain.extract_options(arguments, &block)
    filter_method_names = filters.map { |fm| fm.to_s }.join(', ')
    logger.info "Setting up before_filter to #{filter_method_names}"

    filter_methods_with_logging =
      filters.map { |fm| (fm.to_s + "_with_logging").to_sym }

    filters.each { |fm|
      define_method( (fm.to_s + "_with_logging").to_sym ) { |*args|
        logger.info "Calling before_filter #{fm}"

        if args.empty?
          send fm
        else
          send fm, args
        end
      }
    }
    before_filter_without_logging(filter_methods_with_logging, &block)
  end

  class << self
    alias_method_chain :before_filter, :logging
  end

  before_filter :your_first_before_filter

Томаш Поспишек

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

Я не понимаю, почему logger.info ":user_signed_in called" в этом методе не должен работать. Вы даже можете сделать puts ":user_signed_in called", который печатает эту строку непосредственно между выходными данными rspec. Не будет красиво, но это может быть проще, чем читать весь файл test.log.

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