rspec-rails + rabl渲染视图,即使我不希望它们被渲染?

时间:2012-06-20 17:42:31

标签: ruby-on-rails rspec rspec-rails rabl

我正在使用rabl 0.6.13,rspec-rails 2.10.1和rails 3.2.6。

我正在尝试单独指定我的控制器,但由于某种原因,我的rabl模板在我在控制器规范中使用的模拟中抛出了各种未定义的方法异常。我使用render_views 。我认为除非你在控制器规范中指定render_views,否则rspec不会处理视图。我运行调试器以确保{block}轨道插入前的render_views?评估为false。还有其他人遇到过这个问题吗?

1 个答案:

答案 0 :(得分:0)

啊,所以我明白了!这些评论中概述了这一点: - https://github.com/nesquena/rabl/issues/37#issuecomment-6474467 - https://github.com/rspec/rspec-rails/issues/565#issuecomment-6474362

def self.call(template)
  source = if template.source.empty?
    File.read(template.identifier)
  else # use source
    template.source
  end

  %{ ::Rabl::Engine.new(#{source.inspect}).
      render(self, assigns.merge(local_assigns)) }
end # call

rspec-rails将模板设置为空白源(而不是将整个渲染过程存根,以便rails正确处理格式/ mime-types /等),并且rabl处理程序查看空白源并决定读取文件-系统。因此,无论是rabl还是rspec-rails,都需要稍微调整才能实现这一目标。现在我已经修补了rspec-rails:

class EmptyTemplatePathSetDecorator < ::ActionView::Resolver
  attr_reader :original_path_set

  def initialize(original_path_set)
    @original_path_set = original_path_set
  end

  # @api private
  def find_all(*args)
    original_path_set.find_all(*args).collect do |template|
      ::ActionView::Template.new(
        " ", # <======================== this is not "empty"
        template.identifier,
        template.handler,
        {
          :virtual_path => template.virtual_path,
          :format => template.formats
        }
      )
    end
  end
end