Skip to content

Commit

Permalink
Add support for specifying locals in view tests with assert template
Browse files Browse the repository at this point in the history
Closes rails#4927.
  • Loading branch information
dchelimsky committed Jun 22, 2010
1 parent 1b369be commit 1c8ea45
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 5 deletions.
16 changes: 13 additions & 3 deletions actionpack/lib/action_controller/test_case.rb
Expand Up @@ -40,7 +40,7 @@ def teardown_subscriptions
ActiveSupport::Notifications.unsubscribe("!render_template.action_view")
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
#
Expand All @@ -53,6 +53,12 @@ def teardown_subscriptions
# # assert that no partials were rendered
# 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)
validate_request!

Expand All @@ -72,9 +78,13 @@ def assert_template(options = {}, message = nil)
end
when Hash
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 = found.nil? ? 0 : found[1]
msg = build_message(message,
"expecting ? to be rendered ? time(s) but rendered ? time(s)",
expected_partial, expected_count, actual_count)
Expand Down
15 changes: 15 additions & 0 deletions actionpack/lib/action_view/test_case.rb
Expand Up @@ -103,6 +103,10 @@ def render(options = {}, local_assigns = {}, &block)
output
end

def locals
@locals ||= {}
end

included do
setup :setup_with_controller
end
Expand Down Expand Up @@ -132,12 +136,23 @@ def make_test_case_available_to_view!
end
end

module Locals
attr_accessor :locals

def _render_partial(options)
locals[options[:partial]] = options[:locals]
super(options)
end
end

def _view
@_view ||= begin
view = ActionView::Base.new(ActionController::Base.view_paths, _assigns, @controller)
view.singleton_class.send :include, _helpers
view.singleton_class.send :include, @controller._router.url_helpers
view.singleton_class.send :delegate, :alert, :notice, :to => "request.flash"
view.extend(Locals)
view.locals = self.locals
view.output_buffer = self.output_buffer
view
end
Expand Down
18 changes: 16 additions & 2 deletions actionpack/test/template/test_case_test.rb
Expand Up @@ -220,10 +220,24 @@ def render_from_helper
end

class RenderTemplateTest < ActionView::TestCase
test "render template" do
test "render template supports specifying partials" do
controller.controller_path = "test"
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

0 comments on commit 1c8ea45

Please sign in to comment.