Class: Spec::Rails::Example::ViewExampleGroup

Inherits:
FunctionalExampleGroup show all
Defined in:
lib/spec/rails/example/view_example_group.rb

Overview

View Examples live in $RAILS_ROOT/spec/views/.

View Specs use Spec::Rails::Example::ViewExampleGroup, which provides access to views without invoking any of your controllers. See Spec::Rails::Expectations::Matchers for information about specific expectations that you can set on views.

Example

describe "login/login" do
  before do
    render 'login/login'
  end

  it "should display login form" do
    response.should have_tag("form[action=/login]") do
      with_tag("input[type=text][name=email]")
      with_tag("input[type=password][name=password]")
      with_tag("input[type=submit][value=Login]")
    end
  end
end

Instance Attribute Summary

Attributes inherited from FunctionalExampleGroup

#request, #response

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from FunctionalExampleGroup

#assigns, #cookies, #flash, #orig_assigns, #params, #session, #setup

Methods inherited from ActionController::TestCase

#rescue_action_in_public!

Methods included from RoutingHelpers

#params_from, #route_for

Methods included from RoutingHelpers::ParamsFromQueryString

#params_from_querystring

Class Method Details

.inherited(klass) ⇒ Object

:nodoc:



52
53
54
55
# File 'lib/spec/rails/example/view_example_group.rb', line 52

def inherited(klass) # :nodoc:
  klass.subject { template }
  super
end

Instance Method Details

#add_helpers(options) ⇒ Object

:nodoc:



100
101
102
103
104
105
# File 'lib/spec/rails/example/view_example_group.rb', line 100

def add_helpers(options) #:nodoc:
  @controller.add_helper("application")
  @controller.add_helper(derived_controller_name(options))
  @controller.add_helper(options[:helper]) if options[:helper]
  options[:helpers].each { |helper| @controller.add_helper(helper) } if options[:helpers]
end

#base_view_path(options) ⇒ Object

:nodoc:



77
78
79
# File 'lib/spec/rails/example/view_example_group.rb', line 77

def base_view_path(options) #:nodoc:
  "/#{derived_controller_name(options)}/"
end

#derived_action_name(options) ⇒ Object

:nodoc:



86
87
88
89
# File 'lib/spec/rails/example/view_example_group.rb', line 86

def derived_action_name(options) #:nodoc:
  parts = subject_of_render(options).split('/').reject { |part| part.empty? }
  "#{parts.last}".split('.').first
end

#derived_controller_name(options) ⇒ Object

:nodoc:



81
82
83
84
# File 'lib/spec/rails/example/view_example_group.rb', line 81

def derived_controller_name(options) #:nodoc:
  parts = subject_of_render(options).split('/').reject { |part| part.empty? }
  "#{parts[0..-2].join('/')}"
end

#ensure_that_base_view_path_is_not_set_across_example_groupsObject

:nodoc:



69
70
71
# File 'lib/spec/rails/example/view_example_group.rb', line 69

def ensure_that_base_view_path_is_not_set_across_example_groups #:nodoc:
  ActionView::Base.base_view_path = nil
end

#ensure_that_flash_and_session_work_properlyObject

:nodoc:



61
62
63
64
65
66
67
# File 'lib/spec/rails/example/view_example_group.rb', line 61

def ensure_that_flash_and_session_work_properly #:nodoc:
  @controller.class.__send__ :public, :flash
  @controller.__send__ :initialize_template_class, @response
  @controller.__send__ :assign_shortcuts, @request, @response
  @controller.__send__ :initialize_current_url
  @session = @controller.session
end

#render(*args) ⇒ Object

Renders a template for a View Spec, which then provides access to the result through the response. Also supports render with :inline, which you can use to spec custom form builders, helpers, etc, in the context of a view.

Examples

render('/people/list')
render('/people/list', :helper => MyHelper)
render('/people/list', :helpers => [MyHelper, MyOtherHelper])
render(:partial => '/people/_address')
render(:inline => "<% custom_helper 'argument', 'another argument' %>")

See Spec::Rails::Example::ViewExampleGroup for more information.



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/spec/rails/example/view_example_group.rb', line 120

def render(*args)
  options = Hash === args.last ? args.pop : {}
  
  if args.empty? 
    unless [:partial, :inline, :file, :template, :xml, :json, :update].any? {|k| options.has_key? k} 
      args << self.class.description_parts.first
    end
  end
  
  options[:template] = args.first.to_s.sub(/^\//,'') unless args.empty?
  
  set_base_view_path(options)
  add_helpers(options)

  assigns[:action_name] = @action_name
  
  @request.path_parameters = @request.path_parameters.merge(
    :controller => derived_controller_name(options),
    :action => derived_action_name(options)
  ).merge(options[:path_parameters] || {})

  defaults = { :layout => false }
  options = defaults.merge options

  @controller.__send__(:params).reverse_merge! @request.parameters

  @controller.class.instance_eval %{
    def controller_path
      "#{derived_controller_name(options)}"
    end

    def controller_name
      "#{derived_controller_name(options).split('/').last}"
    end
  }

  @controller.__send__ :forget_variables_added_to_assigns
  @controller.__send__ :render, options
  @controller.__send__ :process_cleanup
end

#set_base_view_path(options) ⇒ Object

:nodoc:



73
74
75
# File 'lib/spec/rails/example/view_example_group.rb', line 73

def set_base_view_path(options) #:nodoc:
  ActionView::Base.base_view_path = base_view_path(options)
end

#subject_of_render(options) ⇒ Object

:nodoc:



91
92
93
94
95
96
97
98
# File 'lib/spec/rails/example/view_example_group.rb', line 91

def subject_of_render(options) #:nodoc:
  [:template, :partial, :file].each do |render_type|
    if options.has_key?(render_type)
      return options[render_type]
    end
  end
  return ""
end

#templateObject

This provides the template. Use this to set mock expectations for dealing with partials

Example

describe "/person/new" do
  it "should use the form partial" do
    template.should_receive(:render).with(:partial => 'form')
    render "/person/new"
  end
end


172
173
174
# File 'lib/spec/rails/example/view_example_group.rb', line 172

def template
  @controller.template
end