rspec-rails 2.8.0.rc1 → 2.8.0.rc2
Sign up to get free protection for your applications and to get access to all the features.
- data/License.txt +22 -0
- data/README.md +253 -119
- data/features/README.md +0 -2
- data/features/Upgrade.md +1 -1
- data/lib/generators/rspec/install/templates/spec/spec_helper.rb +1 -1
- data/lib/generators/rspec/integration/integration_generator.rb +1 -0
- data/lib/generators/rspec/scaffold/scaffold_generator.rb +1 -0
- data/lib/generators/rspec/scaffold/templates/controller_spec.rb +23 -16
- data/lib/rspec/rails/adapters.rb +25 -13
- data/lib/rspec/rails/example/controller_example_group.rb +65 -122
- data/lib/rspec/rails/example/helper_example_group.rb +11 -36
- data/lib/rspec/rails/example/mailer_example_group.rb +1 -1
- data/lib/rspec/rails/example/rails_example_group.rb +5 -0
- data/lib/rspec/rails/example/request_example_group.rb +4 -19
- data/lib/rspec/rails/example/routing_example_group.rb +8 -10
- data/lib/rspec/rails/example/view_example_group.rb +21 -35
- data/lib/rspec/rails/extensions/active_record/base.rb +15 -12
- data/lib/rspec/rails/fixture_support.rb +1 -1
- data/lib/rspec/rails/matchers/be_a_new.rb +63 -30
- data/lib/rspec/rails/matchers/be_new_record.rb +18 -3
- data/lib/rspec/rails/matchers/have_extension.rb +26 -14
- data/lib/rspec/rails/matchers/redirect_to.rb +26 -7
- data/lib/rspec/rails/matchers/relation_match_array.rb +1 -1
- data/lib/rspec/rails/matchers/render_template.rb +27 -8
- data/lib/rspec/rails/matchers/routing_matchers.rb +72 -24
- data/lib/rspec/rails/mocks.rb +42 -34
- data/lib/rspec/rails/module_inclusion.rb +2 -1
- data/lib/rspec/rails/version.rb +1 -1
- data/lib/rspec/rails/view_assigns.rb +31 -34
- data/lib/rspec/rails/view_rendering.rb +10 -6
- data/spec/rspec/rails/example/controller_example_group_spec.rb +2 -2
- data/spec/rspec/rails/example/helper_example_group_spec.rb +5 -5
- data/spec/rspec/rails/example/view_example_group_spec.rb +5 -5
- data/spec/rspec/rails/matchers/be_a_new_spec.rb +2 -0
- data/spec/rspec/rails/matchers/be_new_record_spec.rb +2 -0
- data/spec/rspec/rails/matchers/render_template_spec.rb +3 -5
- data/spec/rspec/rails/mocks/mock_model_spec.rb +28 -0
- metadata +22 -19
data/License.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
(The MIT License)
|
2
|
+
|
3
|
+
Copyright (c) 2006 David Chelimsky, The RSpec Development Team
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
19
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
20
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
21
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
22
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
CHANGED
@@ -2,34 +2,42 @@
|
|
2
2
|
|
3
3
|
rspec-2 for rails-3 with lightweight extensions to each
|
4
4
|
|
5
|
-
|
5
|
+
Note: Use [rspec-rails-1.3](http://github.com/dchelimsky/rspec-rails) for rails-2.
|
6
6
|
|
7
7
|
## Install
|
8
8
|
|
9
|
-
|
9
|
+
```
|
10
|
+
gem install rspec-rails
|
11
|
+
```
|
10
12
|
|
11
13
|
This installs the following gems:
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
```
|
16
|
+
rspec
|
17
|
+
rspec-core
|
18
|
+
rspec-expectations
|
19
|
+
rspec-mocks
|
20
|
+
rspec-rails
|
21
|
+
```
|
18
22
|
|
19
23
|
## Configure
|
20
24
|
|
21
25
|
Add `rspec-rails` to the `:test` and `:development` groups in the Gemfile:
|
22
26
|
|
23
|
-
|
24
|
-
|
25
|
-
|
27
|
+
```ruby
|
28
|
+
group :test, :development do
|
29
|
+
gem "rspec-rails", "~> 2.6"
|
30
|
+
end
|
31
|
+
```
|
26
32
|
|
27
33
|
It needs to be in the `:development` group to expose generators and rake
|
28
34
|
tasks without having to type `RAILS_ENV=test`.
|
29
35
|
|
30
36
|
Now you can run:
|
31
37
|
|
32
|
-
|
38
|
+
```
|
39
|
+
rails generate rspec:install
|
40
|
+
```
|
33
41
|
|
34
42
|
This adds the spec directory and some skeleton files, including
|
35
43
|
the "rake spec" task.
|
@@ -43,20 +51,7 @@ controllers, etc, RSpec specs are generated instead of Test::Unit tests.
|
|
43
51
|
|
44
52
|
Please note that the generators are there to help you get started, but they are
|
45
53
|
no substitute for writing your own examples, and they are only guaranteed to
|
46
|
-
work out of the box for the default scenario (`ActiveRecord`
|
47
|
-
|
48
|
-
### Autotest
|
49
|
-
|
50
|
-
The `rspec:install` generator creates an `.rspec` file, which tells Autotest
|
51
|
-
that you're using RSpec and Rails. You'll also need to add the ZenTest gem to
|
52
|
-
your Gemfile:
|
53
|
-
|
54
|
-
gem "ZenTest"
|
55
|
-
|
56
|
-
At this point, if all of the gems in your Gemfile are installed in system
|
57
|
-
gems, you can just type `autotest`. If, however, Bundler is managing any gems
|
58
|
-
for you directly (i.e. you've got `:git` or `:path` attributes in the `Gemfile`),
|
59
|
-
you'll need to run `bundle exec autotest`.
|
54
|
+
work out of the box for the default scenario (`ActiveRecord` & `Webrat`).
|
60
55
|
|
61
56
|
### Webrat and Capybara
|
62
57
|
|
@@ -64,8 +59,10 @@ You can choose between webrat or capybara for simulating a browser, automating
|
|
64
59
|
a browser, or setting expectations using the matchers they supply. Just add
|
65
60
|
your preference to the Gemfile:
|
66
61
|
|
67
|
-
|
68
|
-
|
62
|
+
```ruby
|
63
|
+
gem "webrat"
|
64
|
+
gem "capybara"
|
65
|
+
```
|
69
66
|
|
70
67
|
## Living on edge
|
71
68
|
|
@@ -73,11 +70,13 @@ Bundler makes it a snap to use the latest code for any gem your app depends on.
|
|
73
70
|
rspec-rails, you'll need to point bundler to the git repositories for `rspec-rails`
|
74
71
|
and the other rspec related gems it depends on:
|
75
72
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
73
|
+
```ruby
|
74
|
+
gem "rspec-rails", :git => "git://github.com/rspec/rspec-rails.git"
|
75
|
+
gem "rspec", :git => "git://github.com/rspec/rspec.git"
|
76
|
+
gem "rspec-core", :git => "git://github.com/rspec/rspec-core.git"
|
77
|
+
gem "rspec-expectations", :git => "git://github.com/rspec/rspec-expectations.git"
|
78
|
+
gem "rspec-mocks", :git => "git://github.com/rspec/rspec-mocks.git"
|
79
|
+
```
|
81
80
|
|
82
81
|
Run `bundle install` and you'll have whatever is in git right now. Any time you
|
83
82
|
want to update to a newer head, just run `bundle update`.
|
@@ -103,14 +102,16 @@ See http://github.com/rspec/rspec-rails/issues
|
|
103
102
|
|
104
103
|
Request specs live in spec/requests.
|
105
104
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
end
|
105
|
+
```ruby
|
106
|
+
describe "widgets resource" do
|
107
|
+
describe "GET index" do
|
108
|
+
it "contains the widgets header" do
|
109
|
+
get "/widgets/index"
|
110
|
+
response.should have_selector("h1", :content => "Widgets")
|
113
111
|
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
```
|
114
115
|
|
115
116
|
Request specs mix in behavior from Rails' integration tests. See the
|
116
117
|
docs for ActionDispatch::Integration::Runner for more information.
|
@@ -118,25 +119,91 @@ docs for ActionDispatch::Integration::Runner for more information.
|
|
118
119
|
# Controller Specs
|
119
120
|
|
120
121
|
Controller specs live in spec/controllers, and mix in
|
121
|
-
ActionController::TestCase::Behavior
|
122
|
-
|
123
|
-
available from Rails.
|
122
|
+
ActionController::TestCase::Behavior, which is the basis for Rails' functional
|
123
|
+
tests.
|
124
124
|
|
125
|
-
|
125
|
+
## with fixtures
|
126
|
+
|
127
|
+
```ruby
|
128
|
+
describe WidgetsController do
|
129
|
+
describe "GET index" do
|
130
|
+
fixtures :widgets
|
131
|
+
|
132
|
+
it "assigns all widgets to @widgets" do
|
133
|
+
get :index
|
134
|
+
assigns(:widgets).should eq(Widget.all)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
```
|
139
|
+
|
140
|
+
## with a factory
|
141
|
+
|
142
|
+
```ruby
|
143
|
+
describe WidgetsController do
|
144
|
+
describe "GET index" do
|
145
|
+
it "assigns all widgets to @widgets" do
|
146
|
+
widget = Factory(:widget)
|
147
|
+
get :index
|
148
|
+
assigns(:widgets).should eq([widget])
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
```
|
153
|
+
|
154
|
+
## with stubs
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
describe WidgetsController do
|
158
|
+
describe "GET index" do
|
159
|
+
it "assigns all widgets to @widgets" do
|
160
|
+
widget = stub_model(Widget)
|
161
|
+
Widget.stub(:all) { [widget] }
|
162
|
+
get :index
|
163
|
+
assigns(:widgets).should eq([widget])
|
164
|
+
end
|
165
|
+
end
|
166
|
+
end
|
167
|
+
```
|
168
|
+
|
169
|
+
## matchers
|
170
|
+
|
171
|
+
In addition to the stock matchers from rspec-expectations, controller
|
172
|
+
specs add these matchers, which delegate to rails' assertions:
|
173
|
+
|
174
|
+
```ruby
|
175
|
+
response.should render_template(*args)
|
176
|
+
# => delegates to assert_template(*args)
|
177
|
+
|
178
|
+
response.should redirect_to(destination)
|
179
|
+
# => delegates to assert_redirected_to(destination)
|
180
|
+
```
|
181
|
+
|
182
|
+
## isolation from views
|
183
|
+
|
184
|
+
RSpec's preferred approach to spec'ing controller behaviour is to isolate
|
185
|
+
the controller from its collaborators. By default, therefore, controller
|
186
|
+
example groups do not render the views in your app. Due to the way Rails
|
187
|
+
searches for view templates, the template still needs to exist, but it
|
188
|
+
won't actually be loaded.
|
189
|
+
|
190
|
+
NOTE that this is different from rspec-rails-1 with rails-2, which did not
|
191
|
+
require the presence of the file at all. Due to changes in rails-3, this
|
192
|
+
was no longer feasible in rspec-rails-2.
|
126
193
|
|
127
194
|
## `render_views`
|
128
|
-
By default, controller specs do not render views. This supports specifying
|
129
|
-
controllers without concern for whether the views they render work correctly
|
130
|
-
(NOTE: the template must exist, unlike rspec-rails-1. See Upgrade.md for more
|
131
|
-
information about this). If you prefer to render the views (a la Rails'
|
132
|
-
functional tests), you can use the `render_views` declaration in each example
|
133
|
-
group:
|
134
195
|
|
135
|
-
|
136
|
-
|
137
|
-
|
196
|
+
If you prefer a more integrated approach, similar to that of Rails'
|
197
|
+
functional tests, you can tell controller groups to render the views in the
|
198
|
+
app with the `render_views` declaration:
|
138
199
|
|
139
|
-
|
200
|
+
```ruby
|
201
|
+
describe WidgetsController do
|
202
|
+
render_views
|
203
|
+
# ...
|
204
|
+
```
|
205
|
+
|
206
|
+
### Upgrade note
|
140
207
|
|
141
208
|
`render_views` replaces `integrate_views` from rspec-rails-1.3
|
142
209
|
|
@@ -145,36 +212,42 @@ group:
|
|
145
212
|
Use `assigns(key)` to express expectations about instance variables that a controller
|
146
213
|
assigns to the view in the course of an action:
|
147
214
|
|
148
|
-
|
149
|
-
|
215
|
+
```ruby
|
216
|
+
get :index
|
217
|
+
assigns(:widgets).should eq(expected_value)
|
218
|
+
```
|
150
219
|
|
151
220
|
# View specs
|
152
221
|
|
153
222
|
View specs live in spec/views, and mix in ActionView::TestCase::Behavior.
|
154
223
|
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
224
|
+
```ruby
|
225
|
+
describe "events/index.html.erb" do
|
226
|
+
it "renders _event partial for each event" do
|
227
|
+
assign(:events, [stub_model(Event), stub_model(Event)])
|
228
|
+
render
|
229
|
+
view.should render_template(:partial => "_event", :count => 2)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
|
233
|
+
describe "events/show.html.erb" do
|
234
|
+
it "displays the event location" do
|
235
|
+
assign(:event, stub_model(Event,
|
236
|
+
:location => "Chicago"
|
237
|
+
))
|
238
|
+
render
|
239
|
+
rendered.should contain("Chicago")
|
240
|
+
end
|
241
|
+
end
|
242
|
+
```
|
172
243
|
|
173
244
|
View specs infer the controller name and path from the path to the view
|
174
245
|
template. e.g. if the template is "events/index.html.erb" then:
|
175
246
|
|
176
|
-
|
177
|
-
|
247
|
+
```ruby
|
248
|
+
controller.controller_path == "events"
|
249
|
+
controller.request.path_parameters[:controller] == "events"
|
250
|
+
```
|
178
251
|
|
179
252
|
This means that most of the time you don't need to set these values. When
|
180
253
|
spec'ing a partial that is included across different controllers, you _may_
|
@@ -183,14 +256,18 @@ need to override these values before rendering the view.
|
|
183
256
|
To provide a layout for the render, you'll need to specify _both_ the template
|
184
257
|
and the layout explicitly. For example:
|
185
258
|
|
186
|
-
|
259
|
+
```ruby
|
260
|
+
render :template => "events/show", :layout => "layouts/application"
|
261
|
+
```
|
187
262
|
|
188
263
|
## `assign(key, val)`
|
189
264
|
|
190
265
|
Use this to assign values to instance variables in the view:
|
191
266
|
|
192
|
-
|
193
|
-
|
267
|
+
```ruby
|
268
|
+
assign(:widget, stub_model(Widget))
|
269
|
+
render
|
270
|
+
```
|
194
271
|
|
195
272
|
The code above assigns `stub_model(Widget)` to the `@widget` variable in the view, and then
|
196
273
|
renders the view.
|
@@ -200,47 +277,92 @@ instance variables you set will be transparently propagated into your views
|
|
200
277
|
(similar to how instance variables you set in controller actions are made
|
201
278
|
available in views). For example:
|
202
279
|
|
203
|
-
|
204
|
-
|
280
|
+
```ruby
|
281
|
+
@widget = stub_model(Widget)
|
282
|
+
render # @widget is available inside the view
|
283
|
+
```
|
205
284
|
|
206
285
|
RSpec doesn't officially support this pattern, which only works as a
|
207
286
|
side-effect of the inclusion of `ActionView::TestCase`. Be aware that it may be
|
208
287
|
made unavailable in the future.
|
209
288
|
|
210
|
-
###
|
289
|
+
### Upgrade note
|
211
290
|
|
212
|
-
|
291
|
+
```ruby
|
292
|
+
# rspec-rails-1.x
|
293
|
+
assigns[key] = value
|
294
|
+
|
295
|
+
# rspec-rails-2.x
|
296
|
+
assign(key, value)
|
297
|
+
```
|
213
298
|
|
214
299
|
## `rendered`
|
215
300
|
|
216
301
|
This represents the rendered view.
|
217
302
|
|
218
|
-
|
219
|
-
|
303
|
+
```ruby
|
304
|
+
render
|
305
|
+
rendered.should =~ /Some text expected to appear on the page/
|
306
|
+
```
|
307
|
+
|
308
|
+
### Upgrade note
|
309
|
+
|
310
|
+
```ruby
|
311
|
+
# rspec-rails-1.x
|
312
|
+
render
|
313
|
+
response.should xxx
|
314
|
+
|
315
|
+
# rspec-rails-2.x
|
316
|
+
render
|
317
|
+
rendered.should xxx
|
318
|
+
```
|
220
319
|
|
221
|
-
|
320
|
+
# Model specs
|
222
321
|
|
223
|
-
|
322
|
+
Model specs live in spec/models.
|
323
|
+
|
324
|
+
```ruby
|
325
|
+
describe Articles do
|
326
|
+
describe ".recent" do
|
327
|
+
it "includes articles published less than one week ago" do
|
328
|
+
article = Article.create!(:published_at => Date.today - 1.week + 1.second)
|
329
|
+
Article.recent.should eq([article])
|
330
|
+
end
|
331
|
+
|
332
|
+
it "excludes articles published at midnight one week ago" do
|
333
|
+
article = Article.create!(:published_at => Date.today - 1.week)
|
334
|
+
Article.recent.should be_empty
|
335
|
+
end
|
336
|
+
|
337
|
+
it "excludes articles published more than one week ago" do
|
338
|
+
article = Article.create!(:published_at => Date.today - 1.week - 1.second)
|
339
|
+
Article.recent.should be_empty
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
```
|
224
344
|
|
225
345
|
# Routing specs
|
226
346
|
|
227
347
|
Routing specs live in spec/routing.
|
228
348
|
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
it "does not expose a list of profiles" do
|
239
|
-
{ :get => "/profiles" }.should_not be_routable
|
240
|
-
end
|
241
|
-
end
|
349
|
+
```ruby
|
350
|
+
describe "routing to profiles" do
|
351
|
+
it "routes /profile/:username to profile#show for username" do
|
352
|
+
{ :get => "/profiles/jsmith" }.should route_to(
|
353
|
+
:controller => "profiles",
|
354
|
+
:action => "show",
|
355
|
+
:username => "jsmith"
|
356
|
+
)
|
357
|
+
end
|
242
358
|
|
243
|
-
|
359
|
+
it "does not expose a list of profiles" do
|
360
|
+
{ :get => "/profiles" }.should_not be_routable
|
361
|
+
end
|
362
|
+
end
|
363
|
+
```
|
364
|
+
|
365
|
+
### Upgrade note
|
244
366
|
|
245
367
|
`route_for` from rspec-rails-1.x is gone. Use `route_to` and `be_routable` instead.
|
246
368
|
|
@@ -248,16 +370,21 @@ Routing specs live in spec/routing.
|
|
248
370
|
|
249
371
|
Helper specs live in spec/helpers, and mix in ActionView::TestCase::Behavior.
|
250
372
|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
373
|
+
Provides a `helper` object which mixes in the helper module being spec'd, along
|
374
|
+
with `ApplicationHelper` (if present).
|
375
|
+
|
376
|
+
```ruby
|
377
|
+
describe EventsHelper do
|
378
|
+
describe "#link_to_event" do
|
379
|
+
it "displays the title, and formatted date" do
|
380
|
+
event = Event.new("Ruby Kaigi", Date.new(2010, 8, 27))
|
381
|
+
# helper is an instance of ActionView::Base configured with the
|
382
|
+
# EventsHelper and all of Rails' built-in helpers
|
383
|
+
helper.link_to_event.should =~ /Ruby Kaigi, 27 Aug, 2010/
|
260
384
|
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
```
|
261
388
|
|
262
389
|
# Matchers
|
263
390
|
|
@@ -268,9 +395,10 @@ of them simply delegate to Rails' assertions.
|
|
268
395
|
* Available in all specs.
|
269
396
|
* Primarily intended for controller specs
|
270
397
|
|
271
|
-
|
398
|
+
```ruby
|
272
399
|
object.should be_a_new(Widget)
|
273
|
-
|
400
|
+
```
|
401
|
+
|
274
402
|
|
275
403
|
Passes if the object is a `Widget` and returns true for `new_record?`
|
276
404
|
|
@@ -280,41 +408,47 @@ Passes if the object is a `Widget` and returns true for `new_record?`
|
|
280
408
|
|
281
409
|
In request and controller specs, apply to the response object:
|
282
410
|
|
283
|
-
|
411
|
+
```ruby
|
412
|
+
response.should render_template("new")
|
413
|
+
```
|
284
414
|
|
285
415
|
In view specs, apply to the view object:
|
286
416
|
|
287
|
-
|
417
|
+
```ruby
|
418
|
+
view.should render_template(:partial => "_form", :locals => { :widget => widget } )
|
419
|
+
```
|
288
420
|
|
289
421
|
## `redirect_to`
|
290
422
|
* Delegates to assert_redirect
|
291
423
|
* Available in request and controller specs.
|
292
424
|
|
293
|
-
|
425
|
+
```ruby
|
294
426
|
response.should redirect_to(widgets_path)
|
295
|
-
|
427
|
+
```
|
296
428
|
|
297
429
|
## `route_to`
|
298
430
|
|
299
431
|
* Delegates to Rails' assert_routing.
|
300
432
|
* Available in routing and controller specs.
|
301
433
|
|
302
|
-
|
434
|
+
```ruby
|
303
435
|
{ :get => "/widgets" }.should route_to(:controller => "widgets", :action => "index")
|
304
|
-
|
436
|
+
```
|
305
437
|
|
306
438
|
## `be_routable`
|
307
439
|
|
308
440
|
Passes if the path is recognized by Rails' routing. This is primarily intended
|
309
441
|
to be used with `should_not` to specify routes that should not be routable.
|
310
442
|
|
311
|
-
|
443
|
+
```ruby
|
444
|
+
{ :get => "/widgets/1/edit" }.should_not be_routable
|
445
|
+
```
|
312
446
|
|
313
|
-
|
447
|
+
# Contribute
|
314
448
|
|
315
449
|
See [http://github.com/rspec/rspec-dev](http://github.com/rspec/rspec-dev)
|
316
450
|
|
317
|
-
|
451
|
+
# Also see
|
318
452
|
|
319
453
|
* [http://github.com/rspec/rspec](http://github.com/rspec/rspec)
|
320
454
|
* [http://github.com/rspec/rspec-core](http://github.com/rspec/rspec-core)
|