2

私はrabl0.6.13、rspec-rails 2.10.1、およびrails3.2.6を使用しています。

私はコントローラーを個別に指定しようとしていますが、何らかの理由で、私のrablテンプレートは、コントローラーの仕様で使用するモックに対して、あらゆる種類の未定義のメソッド例外をスローします。私は使用していませんrender_viewsrender_viewsコントローラの仕様で指定しない限り、rspecはビューを処理しないと思いました。デバッガーを実行して、ブロックrspec-railsが挿入される前にrender_views?評価されることを確認しました。false他の誰かがこの問題に遭遇しましたか?

4

1 に答える 1

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がformats / 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
于 2012-06-21T05:35:28.710 に答える