mirror of https://github.com/rails/rails
Add support for specifying locals in view tests with assert template [#4927 state:resolved]
Signed-off-by: José Valim <jose.valim@gmail.com>
This commit is contained in:
parent
02399a1184
commit
0576ec4ddd
|
@ -40,7 +40,7 @@ module ActionController
|
||||||
ActiveSupport::Notifications.unsubscribe("!render_template.action_view")
|
ActiveSupport::Notifications.unsubscribe("!render_template.action_view")
|
||||||
end
|
end
|
||||||
|
|
||||||
# Asserts that the request was rendered with the appropriate template file or partials
|
# Asserts that the request was rendered with the appropriate template file or partials.
|
||||||
#
|
#
|
||||||
# ==== Examples
|
# ==== Examples
|
||||||
#
|
#
|
||||||
|
@ -53,6 +53,12 @@ module ActionController
|
||||||
# # assert that no partials were rendered
|
# # assert that no partials were rendered
|
||||||
# assert_template :partial => false
|
# assert_template :partial => false
|
||||||
#
|
#
|
||||||
|
# In a view test case, you can also assert that specific locals are passed
|
||||||
|
# to partials:
|
||||||
|
#
|
||||||
|
# # assert that the "_customer" partial was rendered with a specific object
|
||||||
|
# assert_template :partial => '_customer', :locals => { :customer => @customer }
|
||||||
|
#
|
||||||
def assert_template(options = {}, message = nil)
|
def assert_template(options = {}, message = nil)
|
||||||
validate_request!
|
validate_request!
|
||||||
|
|
||||||
|
@ -72,9 +78,13 @@ module ActionController
|
||||||
end
|
end
|
||||||
when Hash
|
when Hash
|
||||||
if expected_partial = options[:partial]
|
if expected_partial = options[:partial]
|
||||||
if expected_count = options[:count]
|
if expected_locals = options[:locals]
|
||||||
|
actual_locals = @locals[expected_partial.to_s.sub(/^_/,'')]
|
||||||
|
expected_locals.each_pair do |k,v|
|
||||||
|
assert_equal(v, actual_locals[k])
|
||||||
|
end
|
||||||
|
elsif expected_count = options[:count]
|
||||||
actual_count = @partials[expected_partial]
|
actual_count = @partials[expected_partial]
|
||||||
# actual_count = found.nil? ? 0 : found[1]
|
|
||||||
msg = build_message(message,
|
msg = build_message(message,
|
||||||
"expecting ? to be rendered ? time(s) but rendered ? time(s)",
|
"expecting ? to be rendered ? time(s) but rendered ? time(s)",
|
||||||
expected_partial, expected_count, actual_count)
|
expected_partial, expected_count, actual_count)
|
||||||
|
|
|
@ -103,6 +103,10 @@ module ActionView
|
||||||
output
|
output
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def locals
|
||||||
|
@locals ||= {}
|
||||||
|
end
|
||||||
|
|
||||||
included do
|
included do
|
||||||
setup :setup_with_controller
|
setup :setup_with_controller
|
||||||
end
|
end
|
||||||
|
@ -132,12 +136,23 @@ module ActionView
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module Locals
|
||||||
|
attr_accessor :locals
|
||||||
|
|
||||||
|
def _render_partial(options)
|
||||||
|
locals[options[:partial]] = options[:locals]
|
||||||
|
super(options)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def _view
|
def _view
|
||||||
@_view ||= begin
|
@_view ||= begin
|
||||||
view = ActionView::Base.new(ActionController::Base.view_paths, _assigns, @controller)
|
view = ActionView::Base.new(ActionController::Base.view_paths, _assigns, @controller)
|
||||||
view.singleton_class.send :include, _helpers
|
view.singleton_class.send :include, _helpers
|
||||||
view.singleton_class.send :include, @controller._router.url_helpers
|
view.singleton_class.send :include, @controller._router.url_helpers
|
||||||
view.singleton_class.send :delegate, :alert, :notice, :to => "request.flash"
|
view.singleton_class.send :delegate, :alert, :notice, :to => "request.flash"
|
||||||
|
view.extend(Locals)
|
||||||
|
view.locals = self.locals
|
||||||
view.output_buffer = self.output_buffer
|
view.output_buffer = self.output_buffer
|
||||||
view
|
view
|
||||||
end
|
end
|
||||||
|
|
|
@ -220,10 +220,24 @@ module ActionView
|
||||||
end
|
end
|
||||||
|
|
||||||
class RenderTemplateTest < ActionView::TestCase
|
class RenderTemplateTest < ActionView::TestCase
|
||||||
test "render template" do
|
test "render template supports specifying partials" do
|
||||||
controller.controller_path = "test"
|
controller.controller_path = "test"
|
||||||
render(:template => "test/calling_partial_with_layout")
|
render(:template => "test/calling_partial_with_layout")
|
||||||
assert_template "partial_for_use_in_layout"
|
assert_template :partial => "_partial_for_use_in_layout"
|
||||||
|
end
|
||||||
|
|
||||||
|
test "render template supports specifying locals (passing)" do
|
||||||
|
controller.controller_path = "test"
|
||||||
|
render(:template => "test/calling_partial_with_layout")
|
||||||
|
assert_template :partial => "_partial_for_use_in_layout", :locals => { :name => "David" }
|
||||||
|
end
|
||||||
|
|
||||||
|
test "render template supports specifying locals (failing)" do
|
||||||
|
controller.controller_path = "test"
|
||||||
|
render(:template => "test/calling_partial_with_layout")
|
||||||
|
assert_raise Test::Unit::AssertionFailedError, /Somebody else.*David/m do
|
||||||
|
assert_template :partial => "_partial_for_use_in_layout", :locals => { :name => "Somebody Else" }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue