rspec-rails 1.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (159) hide show
  1. data/History.txt +57 -0
  2. data/Manifest.txt +158 -0
  3. data/README.txt +81 -0
  4. data/Rakefile +39 -0
  5. data/UPGRADE +7 -0
  6. data/generators/rspec/CHANGES +1 -0
  7. data/generators/rspec/rspec_generator.rb +40 -0
  8. data/generators/rspec/templates/all_stories.rb +4 -0
  9. data/generators/rspec/templates/previous_failures.txt +0 -0
  10. data/generators/rspec/templates/rcov.opts +2 -0
  11. data/generators/rspec/templates/rspec.rake +132 -0
  12. data/generators/rspec/templates/script/autospec +3 -0
  13. data/generators/rspec/templates/script/spec +4 -0
  14. data/generators/rspec/templates/script/spec_server +116 -0
  15. data/generators/rspec/templates/spec.opts +4 -0
  16. data/generators/rspec/templates/spec_helper.rb +47 -0
  17. data/generators/rspec/templates/stories_helper.rb +3 -0
  18. data/generators/rspec_controller/USAGE +33 -0
  19. data/generators/rspec_controller/rspec_controller_generator.rb +49 -0
  20. data/generators/rspec_controller/templates/controller_spec.rb +25 -0
  21. data/generators/rspec_controller/templates/helper_spec.rb +11 -0
  22. data/generators/rspec_controller/templates/view_spec.rb +12 -0
  23. data/generators/rspec_default_values.rb +19 -0
  24. data/generators/rspec_model/USAGE +18 -0
  25. data/generators/rspec_model/rspec_model_generator.rb +35 -0
  26. data/generators/rspec_model/templates/model_spec.rb +15 -0
  27. data/generators/rspec_scaffold/rspec_scaffold_generator.rb +154 -0
  28. data/generators/rspec_scaffold/templates/controller_spec.rb +173 -0
  29. data/generators/rspec_scaffold/templates/edit_erb_spec.rb +26 -0
  30. data/generators/rspec_scaffold/templates/helper_spec.rb +11 -0
  31. data/generators/rspec_scaffold/templates/index_erb_spec.rb +27 -0
  32. data/generators/rspec_scaffold/templates/new_erb_spec.rb +26 -0
  33. data/generators/rspec_scaffold/templates/routing_spec.rb +59 -0
  34. data/generators/rspec_scaffold/templates/show_erb_spec.rb +23 -0
  35. data/init.rb +9 -0
  36. data/lib/autotest/discover.rb +1 -0
  37. data/lib/autotest/rails_rspec.rb +76 -0
  38. data/lib/spec/rails.rb +15 -0
  39. data/lib/spec/rails/example.rb +47 -0
  40. data/lib/spec/rails/example/assigns_hash_proxy.rb +43 -0
  41. data/lib/spec/rails/example/controller_example_group.rb +256 -0
  42. data/lib/spec/rails/example/cookies_proxy.rb +25 -0
  43. data/lib/spec/rails/example/functional_example_group.rb +87 -0
  44. data/lib/spec/rails/example/helper_example_group.rb +166 -0
  45. data/lib/spec/rails/example/model_example_group.rb +14 -0
  46. data/lib/spec/rails/example/rails_example_group.rb +33 -0
  47. data/lib/spec/rails/example/render_observer.rb +93 -0
  48. data/lib/spec/rails/example/view_example_group.rb +183 -0
  49. data/lib/spec/rails/extensions.rb +12 -0
  50. data/lib/spec/rails/extensions/action_controller/base.rb +14 -0
  51. data/lib/spec/rails/extensions/action_controller/rescue.rb +21 -0
  52. data/lib/spec/rails/extensions/action_controller/test_response.rb +11 -0
  53. data/lib/spec/rails/extensions/action_view/base.rb +31 -0
  54. data/lib/spec/rails/extensions/active_record/base.rb +30 -0
  55. data/lib/spec/rails/extensions/object.rb +5 -0
  56. data/lib/spec/rails/extensions/spec/example/configuration.rb +71 -0
  57. data/lib/spec/rails/extensions/spec/matchers/have.rb +21 -0
  58. data/lib/spec/rails/interop/testcase.rb +14 -0
  59. data/lib/spec/rails/matchers.rb +31 -0
  60. data/lib/spec/rails/matchers/assert_select.rb +131 -0
  61. data/lib/spec/rails/matchers/change.rb +11 -0
  62. data/lib/spec/rails/matchers/have_text.rb +57 -0
  63. data/lib/spec/rails/matchers/include_text.rb +54 -0
  64. data/lib/spec/rails/matchers/redirect_to.rb +113 -0
  65. data/lib/spec/rails/matchers/render_template.rb +90 -0
  66. data/lib/spec/rails/mocks.rb +132 -0
  67. data/lib/spec/rails/story_adapter.rb +79 -0
  68. data/lib/spec/rails/version.rb +15 -0
  69. data/spec/rails/autotest/mappings_spec.rb +36 -0
  70. data/spec/rails/example/assigns_hash_proxy_spec.rb +65 -0
  71. data/spec/rails/example/configuration_spec.rb +83 -0
  72. data/spec/rails/example/controller_isolation_spec.rb +62 -0
  73. data/spec/rails/example/controller_spec_spec.rb +272 -0
  74. data/spec/rails/example/cookies_proxy_spec.rb +74 -0
  75. data/spec/rails/example/example_group_factory_spec.rb +112 -0
  76. data/spec/rails/example/helper_spec_spec.rb +161 -0
  77. data/spec/rails/example/model_spec_spec.rb +18 -0
  78. data/spec/rails/example/shared_behaviour_spec.rb +16 -0
  79. data/spec/rails/example/test_unit_assertion_accessibility_spec.rb +33 -0
  80. data/spec/rails/example/view_spec_spec.rb +280 -0
  81. data/spec/rails/extensions/action_controller_rescue_action_spec.rb +54 -0
  82. data/spec/rails/extensions/action_view_base_spec.rb +48 -0
  83. data/spec/rails/extensions/active_record_spec.rb +14 -0
  84. data/spec/rails/interop/testcase_spec.rb +66 -0
  85. data/spec/rails/matchers/assert_select_spec.rb +814 -0
  86. data/spec/rails/matchers/description_generation_spec.rb +37 -0
  87. data/spec/rails/matchers/errors_on_spec.rb +13 -0
  88. data/spec/rails/matchers/have_text_spec.rb +62 -0
  89. data/spec/rails/matchers/include_text_spec.rb +64 -0
  90. data/spec/rails/matchers/redirect_to_spec.rb +209 -0
  91. data/spec/rails/matchers/render_template_spec.rb +176 -0
  92. data/spec/rails/matchers/should_change_spec.rb +15 -0
  93. data/spec/rails/mocks/ar_classes.rb +10 -0
  94. data/spec/rails/mocks/mock_model_spec.rb +106 -0
  95. data/spec/rails/mocks/stub_model_spec.rb +80 -0
  96. data/spec/rails/sample_modified_fixture.rb +8 -0
  97. data/spec/rails/sample_spec.rb +8 -0
  98. data/spec/rails/spec_server_spec.rb +96 -0
  99. data/spec/rails/spec_spec.rb +11 -0
  100. data/spec/rails_suite.rb +7 -0
  101. data/spec/spec_helper.rb +57 -0
  102. data/spec_resources/controllers/action_view_base_spec_controller.rb +2 -0
  103. data/spec_resources/controllers/controller_spec_controller.rb +94 -0
  104. data/spec_resources/controllers/redirect_spec_controller.rb +59 -0
  105. data/spec_resources/controllers/render_spec_controller.rb +30 -0
  106. data/spec_resources/controllers/rjs_spec_controller.rb +58 -0
  107. data/spec_resources/helpers/explicit_helper.rb +38 -0
  108. data/spec_resources/helpers/more_explicit_helper.rb +5 -0
  109. data/spec_resources/helpers/plugin_application_helper.rb +6 -0
  110. data/spec_resources/helpers/view_spec_helper.rb +13 -0
  111. data/spec_resources/views/controller_spec/_partial.rhtml +0 -0
  112. data/spec_resources/views/controller_spec/action_setting_flash_after_session_reset.rhtml +1 -0
  113. data/spec_resources/views/controller_spec/action_setting_flash_before_session_reset.rhtml +1 -0
  114. data/spec_resources/views/controller_spec/action_setting_the_assigns_hash.rhtml +0 -0
  115. data/spec_resources/views/controller_spec/action_with_errors_in_template.rhtml +1 -0
  116. data/spec_resources/views/controller_spec/action_with_template.rhtml +1 -0
  117. data/spec_resources/views/layouts/application.rhtml +0 -0
  118. data/spec_resources/views/layouts/simple.rhtml +0 -0
  119. data/spec_resources/views/objects/_object.html.erb +1 -0
  120. data/spec_resources/views/render_spec/_a_partial.rhtml +0 -0
  121. data/spec_resources/views/render_spec/action_with_alternate_layout.rhtml +0 -0
  122. data/spec_resources/views/render_spec/some_action.js.rjs +1 -0
  123. data/spec_resources/views/render_spec/some_action.rhtml +0 -0
  124. data/spec_resources/views/render_spec/some_action.rjs +1 -0
  125. data/spec_resources/views/rjs_spec/_replacement_partial.rhtml +1 -0
  126. data/spec_resources/views/rjs_spec/hide_div.rjs +1 -0
  127. data/spec_resources/views/rjs_spec/hide_page_element.rjs +1 -0
  128. data/spec_resources/views/rjs_spec/insert_html.rjs +1 -0
  129. data/spec_resources/views/rjs_spec/replace.rjs +1 -0
  130. data/spec_resources/views/rjs_spec/replace_html.rjs +1 -0
  131. data/spec_resources/views/rjs_spec/replace_html_with_partial.rjs +1 -0
  132. data/spec_resources/views/rjs_spec/visual_effect.rjs +1 -0
  133. data/spec_resources/views/rjs_spec/visual_toggle_effect.rjs +1 -0
  134. data/spec_resources/views/tag_spec/no_tags.rhtml +1 -0
  135. data/spec_resources/views/tag_spec/single_div_with_no_attributes.rhtml +1 -0
  136. data/spec_resources/views/tag_spec/single_div_with_one_attribute.rhtml +1 -0
  137. data/spec_resources/views/view_spec/_partial.rhtml +2 -0
  138. data/spec_resources/views/view_spec/_partial_used_twice.rhtml +0 -0
  139. data/spec_resources/views/view_spec/_partial_with_local_variable.rhtml +1 -0
  140. data/spec_resources/views/view_spec/_partial_with_sub_partial.rhtml +1 -0
  141. data/spec_resources/views/view_spec/_spacer.rhtml +1 -0
  142. data/spec_resources/views/view_spec/accessor.rhtml +5 -0
  143. data/spec_resources/views/view_spec/block_helper.rhtml +3 -0
  144. data/spec_resources/views/view_spec/entry_form.rhtml +2 -0
  145. data/spec_resources/views/view_spec/explicit_helper.rhtml +2 -0
  146. data/spec_resources/views/view_spec/foo/show.rhtml +1 -0
  147. data/spec_resources/views/view_spec/implicit_helper.rhtml +2 -0
  148. data/spec_resources/views/view_spec/multiple_helpers.rhtml +3 -0
  149. data/spec_resources/views/view_spec/should_not_receive.rhtml +3 -0
  150. data/spec_resources/views/view_spec/template_with_partial.rhtml +5 -0
  151. data/spec_resources/views/view_spec/template_with_partial_using_collection.rhtml +3 -0
  152. data/spec_resources/views/view_spec/template_with_partial_with_array.rhtml +1 -0
  153. data/stories/all.rb +10 -0
  154. data/stories/configuration/stories.rb +5 -0
  155. data/stories/helper.rb +6 -0
  156. data/stories/steps/people.rb +8 -0
  157. data/stories/transactions_should_rollback +15 -0
  158. data/stories/transactions_should_rollback.rb +25 -0
  159. metadata +234 -0
@@ -0,0 +1,47 @@
1
+ dir = File.dirname(__FILE__)
2
+
3
+ require 'spec/rails/example/assigns_hash_proxy'
4
+
5
+ require "spec/rails/example/render_observer"
6
+ require "spec/rails/example/rails_example_group"
7
+ require "spec/rails/example/model_example_group"
8
+ require "spec/rails/example/functional_example_group"
9
+ require "spec/rails/example/controller_example_group"
10
+ require "spec/rails/example/helper_example_group"
11
+ require "spec/rails/example/view_example_group"
12
+ require "spec/rails/example/cookies_proxy"
13
+
14
+ module Spec
15
+ module Rails
16
+ # Spec::Rails::Example extends Spec::Example (RSpec's core Example module) to provide
17
+ # Rails-specific contexts for describing Rails Models, Views, Controllers and Helpers.
18
+ #
19
+ # == Model Examples
20
+ #
21
+ # These are the equivalent of unit tests in Rails' built in testing. Ironically (for the traditional TDD'er) these are the only specs that we feel should actually interact with the database.
22
+ #
23
+ # See Spec::Rails::Example::ModelExampleGroup
24
+ #
25
+ # == Controller Examples
26
+ #
27
+ # These align somewhat with functional tests in rails, except that they do not actually render views (though you can force rendering of views if you prefer). Instead of setting expectations about what goes on a page, you set expectations about what templates get rendered.
28
+ #
29
+ # See Spec::Rails::Example::ControllerExampleGroup
30
+ #
31
+ # == View Examples
32
+ #
33
+ # This is the other half of Rails functional testing. View specs allow you to set up assigns and render
34
+ # a template. By assigning mock model data, you can specify view behaviour with no dependency on a database
35
+ # or your real models.
36
+ #
37
+ # See Spec::Rails::Example::ViewExampleGroup
38
+ #
39
+ # == Helper Examples
40
+ #
41
+ # These let you specify directly methods that live in your helpers.
42
+ #
43
+ # See Spec::Rails::Example::HelperExampleGroup
44
+ module Example
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,43 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ class AssignsHashProxy #:nodoc:
5
+ def initialize(example_group, &block)
6
+ @block = block
7
+ @example_group = example_group
8
+ end
9
+
10
+ def [](ivar)
11
+ if assigns.include?(ivar.to_s)
12
+ assigns[ivar.to_s]
13
+ elsif assigns.include?(ivar)
14
+ assigns[ivar]
15
+ else
16
+ nil
17
+ end
18
+ end
19
+
20
+ def []=(ivar, val)
21
+ @block.call.instance_variable_set("@#{ivar}", val)
22
+ end
23
+
24
+ def delete(name)
25
+ assigns.delete(name.to_s)
26
+ end
27
+
28
+ def each(&block)
29
+ assigns.each &block
30
+ end
31
+
32
+ def has_key?(key)
33
+ assigns.key?(key.to_s)
34
+ end
35
+
36
+ protected
37
+ def assigns
38
+ @example_group.orig_assigns
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,256 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ # Controller Examples live in $RAILS_ROOT/spec/controllers/.
5
+ #
6
+ # Controller Examples use Spec::Rails::Example::ControllerExampleGroup, which supports running specs for
7
+ # Controllers in two modes, which represent the tension between the more granular
8
+ # testing common in TDD and the more high level testing built into
9
+ # rails. BDD sits somewhere in between: we want to a balance between
10
+ # specs that are close enough to the code to enable quick fault
11
+ # isolation and far enough away from the code to enable refactoring
12
+ # with minimal changes to the existing specs.
13
+ #
14
+ # == Isolation mode (default)
15
+ #
16
+ # No dependencies on views because none are ever rendered. The
17
+ # benefit of this mode is that can spec the controller completely
18
+ # independent of the view, allowing that responsibility to be
19
+ # handled later, or by somebody else. Combined w/ separate view
20
+ # specs, this also provides better fault isolation.
21
+ #
22
+ # == Integration mode
23
+ #
24
+ # To run in this mode, include the +integrate_views+ declaration
25
+ # in your controller context:
26
+ #
27
+ # describe ThingController do
28
+ # integrate_views
29
+ # ...
30
+ #
31
+ # In this mode, controller specs are run in the same way that
32
+ # rails functional tests run - one set of tests for both the
33
+ # controllers and the views. The benefit of this approach is that
34
+ # you get wider coverage from each spec. Experienced rails
35
+ # developers may find this an easier approach to begin with, however
36
+ # we encourage you to explore using the isolation mode and revel
37
+ # in its benefits.
38
+ #
39
+ # == Expecting Errors
40
+ #
41
+ # Rspec on Rails will raise errors that occur in controller actions.
42
+ # In contrast, Rails will swallow errors that are raised in controller
43
+ # actions and return an error code in the header. If you wish to override
44
+ # Rspec and have Rail's default behaviour,tell the controller to use
45
+ # rails error handling ...
46
+ #
47
+ # before(:each) do
48
+ # controller.use_rails_error_handling!
49
+ # end
50
+ #
51
+ # When using Rail's error handling, you can expect error codes in headers ...
52
+ #
53
+ # it "should return an error in the header" do
54
+ # response.should be_error
55
+ # end
56
+ #
57
+ # it "should return a 501" do
58
+ # response.response_code.should == 501
59
+ # end
60
+ #
61
+ # it "should return a 501" do
62
+ # response.code.should == "501"
63
+ # end
64
+ class ControllerExampleGroup < FunctionalExampleGroup
65
+ class << self
66
+
67
+ # Use this to instruct RSpec to render views in your controller examples (Integration Mode).
68
+ #
69
+ # describe ThingController do
70
+ # integrate_views
71
+ # ...
72
+ #
73
+ # See Spec::Rails::Example::ControllerExampleGroup for more information about
74
+ # Integration and Isolation modes.
75
+ def integrate_views(integrate_views = true)
76
+ @integrate_views = integrate_views
77
+ end
78
+
79
+ def integrate_views? # :nodoc:
80
+ @integrate_views
81
+ end
82
+
83
+ def inherited(klass) # :nodoc:
84
+ klass.controller_class_name = controller_class_name
85
+ klass.integrate_views(integrate_views?)
86
+ super
87
+ end
88
+
89
+ # You MUST provide a controller_name within the context of
90
+ # your controller specs:
91
+ #
92
+ # describe "ThingController" do
93
+ # controller_name :thing
94
+ # ...
95
+ def controller_name(name)
96
+ @controller_class_name = "#{name}_controller".camelize
97
+ end
98
+ attr_accessor :controller_class_name # :nodoc:
99
+ end
100
+
101
+ before(:each) do
102
+ # Some Rails apps explicitly disable ActionMailer in environment.rb
103
+ if defined?(ActionMailer)
104
+ @deliveries = []
105
+ ActionMailer::Base.deliveries = @deliveries
106
+ end
107
+
108
+ unless @controller.class.ancestors.include?(ActionController::Base)
109
+ Spec::Expectations.fail_with <<-EOE
110
+ You have to declare the controller name in controller specs. For example:
111
+ describe "The ExampleController" do
112
+ controller_name "example" #invokes the ExampleController
113
+ end
114
+ EOE
115
+ end
116
+ (class << @controller; self; end).class_eval do
117
+ def controller_path #:nodoc:
118
+ self.class.name.underscore.gsub('_controller', '')
119
+ end
120
+ include ControllerInstanceMethods
121
+ end
122
+ @controller.integrate_views! if @integrate_views
123
+ @controller.session = session
124
+ end
125
+
126
+ attr_reader :response, :request, :controller
127
+
128
+ def initialize(defined_description, &implementation) #:nodoc:
129
+ super
130
+ controller_class_name = self.class.controller_class_name
131
+ if controller_class_name
132
+ @controller_class_name = controller_class_name.to_s
133
+ else
134
+ @controller_class_name = self.class.described_type.to_s
135
+ end
136
+ @integrate_views = self.class.integrate_views?
137
+ end
138
+
139
+ # Uses ActionController::Routing::Routes to generate
140
+ # the correct route for a given set of options.
141
+ # == Example
142
+ # route_for(:controller => 'registrations', :action => 'edit', :id => 1)
143
+ # => '/registrations/1;edit'
144
+ def route_for(options)
145
+ ensure_that_routes_are_loaded
146
+ ActionController::Routing::Routes.generate(options)
147
+ end
148
+
149
+ # Uses ActionController::Routing::Routes to parse
150
+ # an incoming path so the parameters it generates can be checked
151
+ # == Example
152
+ # params_from(:get, '/registrations/1;edit')
153
+ # => :controller => 'registrations', :action => 'edit', :id => 1
154
+ def params_from(method, path)
155
+ ensure_that_routes_are_loaded
156
+ ActionController::Routing::Routes.recognize_path(path, :method => method)
157
+ end
158
+
159
+ protected
160
+ def _assigns_hash_proxy
161
+ @_assigns_hash_proxy ||= AssignsHashProxy.new self do
162
+ @response.template
163
+ end
164
+ end
165
+
166
+ private
167
+ def ensure_that_routes_are_loaded
168
+ ActionController::Routing::Routes.reload if ActionController::Routing::Routes.empty?
169
+ end
170
+
171
+ module ControllerInstanceMethods #:nodoc:
172
+ include Spec::Rails::Example::RenderObserver
173
+
174
+ # === render(options = nil, deprecated_status_or_extra_options = nil, &block)
175
+ #
176
+ # This gets added to the controller's singleton meta class,
177
+ # allowing Controller Examples to run in two modes, freely switching
178
+ # from context to context.
179
+ def render(options=nil, deprecated_status_or_extra_options=nil, &block)
180
+ if ::Rails::VERSION::STRING >= '2.0.0' && deprecated_status_or_extra_options.nil?
181
+ deprecated_status_or_extra_options = {}
182
+ end
183
+
184
+ unless block_given?
185
+ unless integrate_views?
186
+ if @template.respond_to?(:finder)
187
+ (class << @template.finder; self; end).class_eval do
188
+ define_method :file_exists? do; true; end
189
+ end
190
+ else
191
+ (class << @template; self; end).class_eval do
192
+ define_method :file_exists? do; true; end
193
+ end
194
+ end
195
+ (class << @template; self; end).class_eval do
196
+ define_method :render_file do |*args|
197
+ @first_render ||= args[0] unless args[0] =~ /^layouts/
198
+ @_first_render ||= args[0] unless args[0] =~ /^layouts/
199
+ end
200
+
201
+ define_method :_pick_template do |*args|
202
+ @_first_render ||= args[0] unless args[0] =~ /^layouts/
203
+ PickedTemplate.new
204
+ end
205
+ end
206
+ end
207
+ end
208
+
209
+ if matching_message_expectation_exists(options)
210
+ render_proxy.render(options, &block)
211
+ @performed_render = true
212
+ else
213
+ if matching_stub_exists(options)
214
+ @performed_render = true
215
+ else
216
+ super(options, deprecated_status_or_extra_options, &block)
217
+ end
218
+ end
219
+ end
220
+
221
+ def response(&block)
222
+ # NOTE - we're setting @update for the assert_select_spec - kinda weird, huh?
223
+ @update = block
224
+ @_response || @response
225
+ end
226
+
227
+ def integrate_views!
228
+ @integrate_views = true
229
+ end
230
+
231
+ private
232
+
233
+ def integrate_views?
234
+ @integrate_views
235
+ end
236
+
237
+ def matching_message_expectation_exists(options)
238
+ render_proxy.send(:__mock_proxy).send(:find_matching_expectation, :render, options)
239
+ end
240
+
241
+ def matching_stub_exists(options)
242
+ render_proxy.send(:__mock_proxy).send(:find_matching_method_stub, :render, options)
243
+ end
244
+
245
+ end
246
+
247
+ Spec::Example::ExampleGroupFactory.register(:controller, self)
248
+ end
249
+
250
+ class PickedTemplate
251
+ def render_template(*ignore_args); end
252
+ def render_partial(*ignore_args); end
253
+ end
254
+ end
255
+ end
256
+ end
@@ -0,0 +1,25 @@
1
+ require 'action_controller/cookies'
2
+
3
+ module Spec
4
+ module Rails
5
+ module Example
6
+ class CookiesProxy
7
+ def initialize(example)
8
+ @example = example
9
+ end
10
+
11
+ def[]=(name, value)
12
+ @example.request.cookies[name.to_s] = CGI::Cookie.new(name.to_s, value)
13
+ end
14
+
15
+ def [](name)
16
+ @example.response.cookies[name.to_s]
17
+ end
18
+
19
+ def delete(name)
20
+ @example.response.cookies.delete(name.to_s)
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,87 @@
1
+ module Spec
2
+ module Rails
3
+ module Example
4
+ class FunctionalExampleGroup < RailsExampleGroup
5
+ include ActionController::TestProcess
6
+ include ActionController::Assertions
7
+
8
+ attr_reader :request, :response
9
+ before(:each) do
10
+ @controller_class = Object.path2class @controller_class_name
11
+ raise "Can't determine controller class for #{@controller_class_name}" if @controller_class.nil?
12
+
13
+ @controller = @controller_class.new
14
+ @request = ActionController::TestRequest.new
15
+ @response = ActionController::TestResponse.new
16
+ @response.session = @request.session
17
+ end
18
+
19
+ def params
20
+ request.parameters
21
+ end
22
+
23
+ def flash
24
+ response.flash
25
+ end
26
+
27
+ def session
28
+ response.session
29
+ end
30
+
31
+ # Overrides the <tt>cookies()</tt> method in
32
+ # ActionController::TestResponseBehaviour, returning a proxy that
33
+ # accesses the requests cookies when setting a cookie and the
34
+ # responses cookies when reading one. This allows you to set and read
35
+ # cookies in examples using the same API with which you set and read
36
+ # them in controllers.
37
+ #
38
+ # == Examples (Rails >= 1.2.6)
39
+ #
40
+ # cookies[:user_id] = '1234'
41
+ # get :index
42
+ # assigns[:user].id.should == '1234'
43
+ #
44
+ # post :login
45
+ # cookies[:login].expires.should == 1.week.from_now
46
+ #
47
+ # == Examples (Rails >= 2.0.0 only)
48
+ #
49
+ # cookies[:user_id] = {:value => '1234', :expires => 1.minute.ago}
50
+ # get :index
51
+ # response.should be_redirect
52
+ def cookies
53
+ @cookies ||= Spec::Rails::Example::CookiesProxy.new(self)
54
+ end
55
+
56
+ alias_method :orig_assigns, :assigns
57
+
58
+ # :call-seq:
59
+ # assigns()
60
+ #
61
+ # Hash of instance variables to values that are made available to
62
+ # views. == Examples
63
+ #
64
+ # #in thing_controller.rb
65
+ # def new
66
+ # @thing = Thing.new
67
+ # end
68
+ #
69
+ # #in thing_controller_spec
70
+ # get 'new'
71
+ # assigns[:registration].should == Thing.new
72
+ #--
73
+ # NOTE - Even though docs only use assigns[:key] format, this supports
74
+ # assigns(:key) in order to avoid breaking old specs.
75
+ #++
76
+ def assigns(key = nil)
77
+ if key.nil?
78
+ _assigns_hash_proxy
79
+ else
80
+ _assigns_hash_proxy[key]
81
+ end
82
+ end
83
+
84
+ end
85
+ end
86
+ end
87
+ end