如何在rspec控制器测试期间记录rails控制器过滤器

时间:2011-02-09 23:47:52

标签: ruby-on-rails logging filter controller rspec

假设我有一个带有许多过滤器的控制器。在控制器测试中,代码永远不会到达#create方法,尽管在我发布的规范中:create。就我而言,就是那个

before_filter:user_signed_in

没有验证,但测试日志没有表明这一点,所以我不得不通过依次打开/关闭所有过滤器来解决这个问题。是否有可能让Rails进行一些详细的日志记录,因为它依次处理每个过滤器并将其输出到测试日志?

2 个答案:

答案 0 :(得分:5)

以下是我如何解决同样的问题。我确信下面的代码仍然可以进行很多改进,并可能放入它自己的模块中。改进很好。

您需要将以下代码放入顶部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

TomášPospíšek

答案 1 :(得分:0)

我没有看到,为什么该方法中的logger.info ":user_signed_in called"不起作用。你甚至可以做puts ":user_signed_in called",它直接在rspec的输出之间打印该行。不会很漂亮,但它可能比阅读整个test.log文件更容易。