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:
David Chelimsky 2010-06-22 01:40:22 -05:00 committed by José Valim
parent 02399a1184
commit 0576ec4ddd
3 changed files with 44 additions and 5 deletions

View File

@ -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)

View File

@ -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

View File

@ -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