2011-02-09 141 views
3

假设我有一个包含许多之前过滤器的控制器。在控制器测试中,代码永远不会进入#create方法,尽管在规范中我做了post:create。在我的情况下,它是如何在rspec控制器测试期间登录rails控制器过滤器

的before_filter:user_signed_in

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

回答

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 

托马什Pospíšek

+0

这是否适用于Rails 3? – Sunny 2011-10-14 18:44:27

0

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

+1

我想你错过的目的的问题。我想避免搜索每个过滤器的源代码并在那里插入Rails.logger命令。我希望轨道中可能存在一些钩子以允许跟踪回调序列。 – bradgonesurfing 2011-02-13 04:03:19