Вот обновленная версия matcher. Я обновил его, чтобы соответствовать последней версии RSpec. Я добавил соответствующие атрибуты только для чтения и удалил старый формат возврата.
# in spec_helper.rb
class UseLayout
attr_reader :expected
attr_reader :actual
def initialize(expected)
@expected = 'layouts/' + expected
end
def matches?(controller)
if controller.is_a?(ActionController::Base)
@actual = 'layouts/' + controller.class.read_inheritable_attribute(:layout)
else
@actual = controller.layout
end
@actual ||= "layouts/application"
@actual == @expected
end
def description
"Determines if a controller uses a layout"
end
def failure_message
return "use_layout expected #{@expected.inspect}, got #{@actual.inspect}"
end
def negeative_failure_message
return "use_layout expected #{@expected.inspect} not to equal #{@actual.inspect}"
end
end
def use_layout(expected)
UseLayout.new(expected)
end
Кроме того, сопоставитель теперь также работает с макетами, указанными на уровне класса контроллера, и может использоваться следующим образом:
class PostsController < ApplicationController
layout "posts"
end
А в спецификации контроллера вы можете просто использовать:
it { should use_layout("posts") }