rspec-rails + rabl рендеринг представлений, даже если я не хочу, чтобы они отображались?
Я использую rabl 0.6.13, rspec-rails 2.10.1 и rails 3.2.6.
Я пытаюсь специфицировать свои контроллеры изолированно, но по какой-то причине мои шаблоны rabl выдают мне всевозможные неопределенные исключения методов для mock, которые я использую в спецификациях контроллеров. Я не пользуюсь render_views
, Я думал, что rspec не обрабатывает представления, если вы не укажете render_views
в контроллере спец. Я запустил отладчик, чтобы убедиться, что render_views?
оценивает false
в блоке rspec-rails вставки перед. Кто-нибудь еще сталкивался с этой проблемой?
1 ответ
Ах, вот я и понял! Это изложено в этих комментариях: - https://github.com/nesquena/rabl/issues/37- https://github.com/rspec/rspec-rails/issues/565
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/etc.), и обработчик 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