rspec-rails 3.8.2 → 3.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: edce77d0d2b773c93324d304106851437971402da3cb8f09cfcd95e0b8aaa043
4
- data.tar.gz: 42c45cdb32667e36ed9e9ae99f833f1f7dcb5c23d0b4daae5b8dd71f2f05928c
3
+ metadata.gz: b76ee007b0ff4daff8f82e2465b9113cab486c9c70f5d9a6e70640f978c36d8d
4
+ data.tar.gz: a1b3441077b5535eeba867fdebebccfc1839e4a4b7a41c6294511c37f178152d
5
5
  SHA512:
6
- metadata.gz: 1d60c04fdfd11a5010b305a5d7af91335d683d027b5c48ea53446b6ae4b9c5388f23007131f6c0bbdf81251670caa7c61c158ce14815b211ca300c4cc545ac61
7
- data.tar.gz: b7d2efcaa5241e0a5a04079f121465426710f3690e8b900a76e6ff43bb71a682ae2072a23b8a80ca079b326a3be55f17c2fd8f97497725f209d10992c78b9e40
6
+ metadata.gz: 70976f62f63a766f1db09c523f9565f21dc023e29a1e4f27874d09614d7cf26313a7b6e44a2007220668eafb06f3fce8640ead665970d46fee0453a1f6fe5172
7
+ data.tar.gz: 1170e6543f4d19dec09c3e754d78ea9807aa7ec17156637dc79a4c3bf192d7306052b1d42e671c03475482d80d22f623dc9f8ceea492eebf5aa590864f86e557
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -1,6 +1,13 @@
1
- ### Development
1
+ ### 3.8.3 / 2019-10-03
2
2
  [Full Changelog](http://github.com/rspec/rspec-rails/compare/v3.8.2...master)
3
3
 
4
+ Bug Fixes:
5
+
6
+ * Namespaced fixtures now generate a `/` seperated path rather than an `_`.
7
+ (@nxlith, #2077)
8
+ * Check the arity of `errors` before attempting to use it to generate the `be_valid`
9
+ error message. (Kevin Kuchta, #2096)
10
+
4
11
  ### 3.8.2 / 2019-01-13
5
12
  [Full Changelog](http://github.com/rspec/rspec-rails/compare/v3.8.1...v3.8.2)
6
13
 
data/README.md CHANGED
@@ -1,602 +1,370 @@
1
- # rspec-rails [![Build Status](https://secure.travis-ci.org/rspec/rspec-rails.svg?branch=master)](http://travis-ci.org/rspec/rspec-rails) [![Code Climate](https://img.shields.io/codeclimate/github/rspec/rspec-rails.svg)](https://codeclimate.com/github/rspec/rspec-rails)
2
- **rspec-rails** is a testing framework for Rails 3.x, 4.x and 5.x.
1
+ # rspec-rails [![Build Status][]][travis-ci] [![Code Climate][]][code-climate] [![Gem Version][]](gem-version)
3
2
 
4
- Use **[rspec-rails 1.x](http://github.com/dchelimsky/rspec-rails)** for Rails
5
- 2.x.
3
+ `rspec-rails` brings the [RSpec][] testing framework to [Ruby on Rails][]
4
+ as a drop-in alternative to its default testing framework, Minitest.
6
5
 
7
- ## Installation
6
+ In RSpec, tests are not just scripts that verify your application code.
7
+ They’re also specifications (or _specs,_ for short):
8
+ detailed explanations of how the application is supposed to behave,
9
+ expressed in plain English.
8
10
 
9
- Add `rspec-rails` to **both** the `:development` and `:test` groups in the
10
- `Gemfile`:
11
+ Use **[`rspec-rails` 1.x][]** for Rails 2.x.
11
12
 
12
- ```ruby
13
- group :development, :test do
14
- gem 'rspec-rails', '~> 3.7'
15
- end
16
- ```
13
+ [Build Status]: https://secure.travis-ci.org/rspec/rspec-rails.svg?branch=master
14
+ [travis-ci]: https://travis-ci.org/rspec/rspec-rails
15
+ [Code Climate]: https://codeclimate.com/github/rspec/rspec-rails.svg
16
+ [code-climate]: https://codeclimate.com/github/rspec/rspec-rails
17
+ [Gem Version]: https://badge.fury.io/rb/rspec-rails.svg
18
+ [gem-version]: https://badge.fury.io/rb/rspec-rails
19
+ [RSpec]: https://rspec.info/
20
+ [Ruby on Rails]: https://rubyonrails.org/
21
+ [`rspec-rails` 1.x]: https://github.com/dchelimsky/rspec-rails
17
22
 
18
- Want to run against the `master` branch? You'll need to include the dependent
19
- RSpec repos as well. Add the following to your `Gemfile`:
23
+ ## Installation
20
24
 
21
- ```ruby
22
- %w[rspec-core rspec-expectations rspec-mocks rspec-rails rspec-support].each do |lib|
23
- gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'master'
24
- end
25
- ```
25
+ 1. Add `rspec-rails` to **both** the `:development` and `:test` groups
26
+ of your app’s `Gemfile`:
26
27
 
27
- Download and install by running:
28
+ ```ruby
29
+ # Run against the latest stable release
30
+ group :development, :test do
31
+ gem 'rspec-rails', '~> 3.8'
32
+ end
28
33
 
29
- ```
30
- bundle install
31
- ```
34
+ # Or, run against the master branch
35
+ # (requires master-branch versions of all related RSpec libraries)
36
+ group :development, :test do
37
+ %w[rspec-core rspec-expectations rspec-mocks rspec-rails rspec-support].each do |lib|
38
+ gem lib, :git => "https://github.com/rspec/#{lib}.git", :branch => 'master'
39
+ end
40
+ end
41
+ ```
32
42
 
33
- Initialize the `spec/` directory (where specs will reside) with:
43
+ (Adding it to the `:development` group is not strictly necessary,
44
+ but without it, generators and rake tasks must be preceded by `RAILS_ENV=test`.)
34
45
 
35
- ```
36
- rails generate rspec:install
37
- ```
46
+ 2. Then, in your project directory:
38
47
 
39
- This adds the following files which are used for configuration:
48
+ ```sh
49
+ # Download and install
50
+ $ bundle install
40
51
 
41
- - `.rspec`
42
- - `spec/spec_helper.rb`
43
- - `spec/rails_helper.rb`
52
+ # Generate boilerplate configuration files
53
+ # (check the comments in each generated file for more information)
54
+ $ rails generate rspec:install
55
+ create .rspec
56
+ create spec
57
+ create spec/spec_helper.rb
58
+ create spec/rails_helper.rb
59
+ ```
44
60
 
45
- Check the comments in each file for more information.
61
+ ## Upgrading
46
62
 
47
- Use the `rspec` command to run your specs:
63
+ If your project is already using an older version of `rspec-rails`,
64
+ upgrade to the latest version with:
48
65
 
49
- ```
50
- bundle exec rspec
66
+ ```sh
67
+ $ bundle update rspec-rails
51
68
  ```
52
69
 
53
- By default the above will run all `_spec.rb` files in the `spec` directory. For
54
- more details about this see the [RSpec spec file
55
- docs](https://www.relishapp.com/rspec/rspec-core/docs/spec-files).
70
+ RSpec follows [semantic versioning](https://semver.org/),
71
+ which means that “major version” upgrades (_e.g.,_ 2.x → 3.x)
72
+ come with **breaking changes**.
73
+ If you’re upgrading from version 2.x or below,
74
+ read the [`rspec-rails` upgrade notes][] to find out what to watch out for.
56
75
 
57
- To run only a subset of these specs use the following command:
76
+ Be sure to check the general [RSpec upgrade notes][] as well.
58
77
 
59
- ```
60
- # Run only model specs
61
- bundle exec rspec spec/models
78
+ [`rspec-rails` upgrade notes]: https://www.relishapp.com/rspec/rspec-rails/docs/upgrade
79
+ [RSpec upgrade notes]: https://relishapp.com/rspec/docs/upgrade
62
80
 
63
- # Run only specs for AccountsController
64
- bundle exec rspec spec/controllers/accounts_controller_spec.rb
81
+ ## Usage
65
82
 
66
- # Run only spec on line 8 of AccountsController
67
- bundle exec rspec spec/controllers/accounts_controller_spec.rb:8
68
- ```
83
+ ### Creating boilerplate specs with `rails generate`
69
84
 
70
- Specs can also be run via `rake spec`, though this command may be slower to
71
- start than the `rspec` command.
85
+ ```sh
86
+ # RSpec hooks into built-in generators
87
+ $ rails generate model user
88
+ invoke active_record
89
+ create db/migrate/20181017040312_create_users.rb
90
+ create app/models/user.rb
91
+ invoke rspec
92
+ create spec/models/user_spec.rb
72
93
 
73
- In Rails 4/5+, you may want to create a binstub for the `rspec` command so it can
74
- be run via `bin/rspec`:
94
+ # RSpec also provides its own spec file generators
95
+ $ rails generate rspec:model user
96
+ create spec/models/user_spec.rb
75
97
 
98
+ # List all RSpec generators
99
+ $ rails generate --help | grep rspec
76
100
  ```
77
- bundle binstubs rspec-core
78
- ```
79
-
80
- ### Upgrade Note
81
-
82
- For detailed information on the general RSpec 3.x upgrade process see the
83
- [RSpec Upgrade docs](https://relishapp.com/rspec/docs/upgrade).
84
-
85
- There are three particular `rspec-rails` specific changes to be aware of:
86
101
 
87
- 1. [The default helper files created in RSpec 3.x have changed](https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#default-helper-files)
88
- 2. [File-type inference disabled by default](https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#file-type-inference-disabled)
89
- 3. [Rails 4.x `ActiveRecord::Migration` pending migration checks](https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#pending-migration-checks)
90
- 4. Extraction of `stub_model` and `mock_model` to
91
- [`rspec-activemodel-mocks`](https://github.com/rspec/rspec-activemodel-mocks)
92
- 5. In Rails 5.x, controller testing has been moved to its own gem which is [rails-controller-testing](https://github.com/rails/rails-controller-testing). Using `assigns` in your controller specs without adding this gem will no longer work.
93
- 6. `rspec-rails` now includes two helpers, `spec_helper.rb` and `rails_helper.rb`.
94
- `spec_helper.rb` is the conventional RSpec configuration helper, whilst the
95
- Rails specific loading and bootstrapping has moved to the `rails_helper.rb`
96
- file. Rails specs now need this file required beforehand either at the top
97
- of the specific file (recommended) or a common configuration location such
98
- as your `.rspec` file.
102
+ ### Running specs
99
103
 
100
- Please see the [RSpec Rails Upgrade
101
- docs](https://www.relishapp.com/rspec/rspec-rails/docs/upgrade) for full
102
- details.
104
+ ```sh
105
+ # Default: Run all spec files (i.e., those matching spec/**/*_spec.rb)
106
+ $ bundle exec rspec
103
107
 
104
- **NOTE:** Generators run in RSpec 3.x will now require `rails_helper` instead
105
- of `spec_helper`.
108
+ # Run all spec files in a single directory (recursively)
109
+ $ bundle exec rspec spec/models
106
110
 
107
- ### Generators
111
+ # Run a single spec file
112
+ $ bundle exec rspec spec/controllers/accounts_controller_spec.rb
108
113
 
109
- Once installed, RSpec will generate spec files instead of Test::Unit test files
110
- when commands like `rails generate model` and `rails generate controller` are
111
- used.
114
+ # Run a single example from a spec file (by line number)
115
+ $ bundle exec rspec spec/controllers/accounts_controller_spec.rb:8
112
116
 
113
- You may also invoke RSpec generators independently. For instance,
114
- running `rails generate rspec:model` will generate a model spec. For more
115
- information, see [list of all
116
- generators](https://www.relishapp.com/rspec/rspec-rails/docs/generators).
117
-
118
- ## Contributing
119
-
120
- Once you've set up the environment, you'll need to cd into the working
121
- directory of whichever repo you want to work in. From there you can run the
122
- specs and cucumber features, and make patches.
123
-
124
- NOTE: You do not need to use rspec-dev to work on a specific RSpec repo. You
125
- can treat each RSpec repo as an independent project.
126
- Please see the following files:
127
-
128
- For `rspec-rails`-specific development information, see
129
-
130
- - [Build details](BUILD_DETAIL.md)
131
- - [Code of Conduct](CODE_OF_CONDUCT.md)
132
- - [Detailed contributing guide](CONTRIBUTING.md)
133
- - [Development setup guide](DEVELOPMENT.md)
134
-
135
-
136
- ## Model Specs
137
-
138
- Use model specs to describe behavior of models (usually ActiveRecord-based) in
139
- the application.
140
-
141
- Model specs default to residing in the `spec/models` folder. Tagging any
142
- context with the metadata `:type => :model` treats its examples as model
143
- specs.
144
-
145
- For example:
146
-
147
- ```ruby
148
- require "rails_helper"
149
-
150
- RSpec.describe Post, :type => :model do
151
- context "with 2 or more comments" do
152
- it "orders them in reverse chronologically" do
153
- post = Post.create!
154
- comment1 = post.comments.create!(:body => "first comment")
155
- comment2 = post.comments.create!(:body => "second comment")
156
- expect(post.reload.comments).to eq([comment2, comment1])
157
- end
158
- end
159
- end
117
+ # See all options for running specs
118
+ $ bundle exec rspec --help
160
119
  ```
161
120
 
162
- For more information, see [cucumber scenarios for model
163
- specs](https://www.relishapp.com/rspec/rspec-rails/docs/model-specs).
121
+ **Optional:** If `bundle exec rspec` is too verbose for you,
122
+ you can generate a binstub at `bin/rspec`
123
+ and use that instead (Rails 4+ only):
164
124
 
165
- ## Request Specs
125
+ ```sh
126
+ $ bundle binstubs rspec-core
127
+ ```
166
128
 
167
- Use request specs to describe the client-facing behavior of the application —
168
- specifically, the HTTP response to be issued for a given request (a.k.a.
169
- integration tests). Since such client-facing behavior encompasses controller
170
- actions, this is the type of spec to use for controller testing.
129
+ ## RSpec DSL Basics (or, how do I write a spec?)
171
130
 
172
- Request specs default to residing in the `spec/requests`, `spec/api`, and
173
- `spec/integration` directories. Tagging any context with the metadata `:type =>
174
- :request` treats its examples as request specs.
175
-
176
- Request specs mix in behavior from
177
- [ActionDispatch::Integration::Runner](http://api.rubyonrails.org/classes/ActionDispatch/Integration/Runner.html),
178
- which is the basis for [Rails' integration
179
- tests](http://guides.rubyonrails.org/testing.html#integration-testing).
131
+ In RSpec, application behavior is described
132
+ **first in (almost) plain English, then again in test code**, like so:
180
133
 
181
134
  ```ruby
182
- require 'rails_helper'
183
-
184
- RSpec.describe "home page", :type => :request do
185
- it "displays the user's username after successful login" do
186
- user = User.create!(:username => "jdoe", :password => "secret")
187
- get "/login"
188
- assert_select "form.login" do
189
- assert_select "input[name=?]", "username"
190
- assert_select "input[name=?]", "password"
191
- assert_select "input[type=?]", "submit"
135
+ RSpec.describe 'Post' do #
136
+ context 'before publication' do # (almost) plain English
137
+ it 'cannot have comments' do #
138
+ expect { Post.create.comments.create! }.to raise_error(ActiveRecord::RecordInvalid) # test code
192
139
  end
193
-
194
- post "/login", :username => "jdoe", :password => "secret"
195
- assert_select ".header .username", :text => "jdoe"
196
- end
197
- end
198
- ```
199
-
200
- The above example uses only standard Rails and RSpec APIs, but many
201
- RSpec/Rails users like to use extension libraries like
202
- [FactoryBot](https://github.com/thoughtbot/factory_bot) and
203
- [Capybara](https://github.com/jnicklas/capybara):
204
-
205
- ```ruby
206
- require 'rails_helper'
207
-
208
- RSpec.describe "home page", :type => :request do
209
- it "displays the user's username after successful login" do
210
- user = FactoryBot.create(:user, :username => "jdoe", :password => "secret")
211
- visit "/login"
212
- fill_in "Username", :with => "jdoe"
213
- fill_in "Password", :with => "secret"
214
- click_button "Log in"
215
-
216
- expect(page).to have_selector(".header .username", :text => "jdoe")
217
140
  end
218
141
  end
219
142
  ```
220
143
 
221
- FactoryBot decouples this example from changes to validation requirements,
222
- which can be encoded into the underlying factory definition without requiring
223
- changes to this example.
224
-
225
- Among other benefits, Capybara binds the form post to the generated HTML, which
226
- means we don't need to specify them separately. Note that Capybara's DSL as
227
- shown is, by default, only available in specs in the spec/features directory.
228
- For more information, see the [Capybara integration
229
- docs](http://rubydoc.info/gems/rspec-rails/file/Capybara.md).
230
-
231
- There are several other Ruby libs that implement the factory pattern or provide
232
- a DSL for request specs (a.k.a. acceptance or integration specs), but
233
- FactoryBot and Capybara seem to be the most widely used. Whether you choose
234
- these or other libs, we strongly recommend using something for each of these
235
- roles.
236
-
237
- For more information, see [cucumber scenarios for request
238
- specs](https://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec).
239
-
240
- ## Controller Specs
241
-
242
- Controller specs can be used to describe the behavior of Rails controllers. As
243
- of version 3.5, however, controller specs are discouraged in favor of request
244
- specs (which also focus largely on controllers, but capture other critical
245
- aspects of application behavior as well). Controller specs will continue to be
246
- supported until at least version 4.0 (see the [release
247
- notes](http://rspec.info/blog/2016/07/rspec-3-5-has-been-released/#rails-support-for-rails-5)
248
- for details).
249
-
250
- For more information, see [cucumber scenarios for controller
251
- specs](https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs).
252
-
253
- ## Feature Specs
254
-
255
- Feature specs test your application from the outside by simulating a browser.
256
- [`capybara`](https://github.com/jnicklas/capybara) is used to manage the
257
- simulated browser.
258
-
259
- Feature specs default to residing in the `spec/features` folder. Tagging any
260
- context with the metadata `:type => :feature` treats its examples as feature
261
- specs.
144
+ Running `rspec` will execute this test code,
145
+ and then use the plain-English descriptions
146
+ to generate a report of where the application
147
+ conforms to (or fails to meet) the spec:
262
148
 
263
- Feature specs mix in functionality from the capybara gem, thus they require
264
- `capybara` to use. To use feature specs, add `capybara` to the `Gemfile`:
265
-
266
- ```ruby
267
- gem "capybara"
268
149
  ```
150
+ $ rspec --format documentation spec/models/post_spec.rb
269
151
 
270
- For more information, see the [cucumber scenarios for feature
271
- specs](https://www.relishapp.com/rspec/rspec-rails/v/3-4/docs/feature-specs/feature-spec).
272
-
273
- ## Mailer specs
152
+ Post
153
+ before publication
154
+ cannot have comments
274
155
 
275
- By default Mailer specs reside in the `spec/mailers` folder. Adding the metadata
276
- `:type => :mailer` to any context makes its examples be treated as mailer specs.
156
+ Failures:
277
157
 
278
- `ActionMailer::TestCase::Behavior` is mixed into your mailer specs.
279
-
280
- ```ruby
281
- require "rails_helper"
158
+ 1) Post before publication cannot have comments
159
+ Failure/Error: expect { Post.create.comments.create! }.to raise_error(ActiveRecord::RecordInvalid)
160
+ expected ActiveRecord::RecordInvalid but nothing was raised
161
+ # ./spec/models/post.rb:4:in `block (3 levels) in <top (required)>'
282
162
 
283
- RSpec.describe Notifications, :type => :mailer do
284
- describe "notify" do
285
- let(:mail) { Notifications.signup }
163
+ Finished in 0.00527 seconds (files took 0.29657 seconds to load)
164
+ 1 example, 1 failure
286
165
 
287
- it "renders the headers" do
288
- expect(mail.subject).to eq("Signup")
289
- expect(mail.to).to eq(["to@example.org"])
290
- expect(mail.from).to eq(["from@example.com"])
291
- end
166
+ Failed examples:
292
167
 
293
- it "renders the body" do
294
- expect(mail.body.encoded).to match("Hi")
295
- end
296
- end
297
- end
168
+ rspec ./spec/models/post_spec.rb:3 # Post before publication cannot have comments
298
169
  ```
299
170
 
300
- For more information, see the [cucumber scenarios for mailer specs
301
- ](https://relishapp.com/rspec/rspec-rails/v/3-4/docs/mailer-specs).
302
-
303
- ## Job specs
304
-
305
- Tagging a context with the metadata `:type => :job` treats its examples as job
306
- specs. Typically these specs will live in `spec/jobs`.
307
-
308
- ```ruby
309
- require 'rails_helper'
310
-
311
- RSpec.describe UploadBackupsJob, :type => :job do
312
- describe "#perform_later" do
313
- it "uploads a backup" do
314
- ActiveJob::Base.queue_adapter = :test
315
- UploadBackupsJob.perform_later('backup')
316
- expect(UploadBackupsJob).to have_been_enqueued
317
- end
318
- end
319
- end
320
- ```
321
-
322
- For more information, see the [cucumber scenarios for job specs
323
- ](https://relishapp.com/rspec/rspec-rails/docs/job-specs).
324
-
325
- ## View specs
171
+ For an in-depth look at the RSpec DSL, including lots of examples,
172
+ read the official Cucumber documentation for [RSpec Core][].
326
173
 
327
- View specs default to residing in the `spec/views` folder. Tagging any context
328
- with the metadata `:type => :view` treats its examples as view specs.
174
+ [RSpec Core]: https://relishapp.com/rspec/rspec-core/docs
329
175
 
330
- View specs mix in `ActionView::TestCase::Behavior`.
176
+ ### Helpful Rails Matchers
331
177
 
332
- ```ruby
333
- require 'rails_helper'
178
+ In RSpec, assertions are called _expectations,_
179
+ and every expectation is built around a _matcher._
180
+ When you `expect(a).to eq(b)`, you’re using the `eq` matcher.
334
181
 
335
- RSpec.describe "events/index", :type => :view do
336
- it "renders _event partial for each event" do
337
- assign(:events, [double(Event), double(Event)])
338
- render
339
- expect(view).to render_template(:partial => "_event", :count => 2)
340
- end
341
- end
182
+ In addition to [the matchers that come standard in RSpec][],
183
+ here are some extras that make it easier
184
+ to test the various parts of a Rails system:
342
185
 
343
- RSpec.describe "events/show", :type => :view do
344
- it "displays the event location" do
345
- assign(:event, Event.new(:location => "Chicago"))
346
- render
347
- expect(rendered).to include("Chicago")
348
- end
349
- end
350
- ```
186
+ | RSpec matcher | Delegates to | Available in | Notes |
187
+ | ------------------------ | ----------------- | ------------------------------- | -------------------------------------------------------- |
188
+ | [`be_a_new`][] | | all | primarily intended for controller specs |
189
+ | [`render_template`][] | `assert_template` | request / controller / view | use with `expect(response).to` |
190
+ | [`redirect_to`][] | `assert_redirect` | request / controller | use with `expect(response).to` |
191
+ | [`route_to`] | `assert_routing` | routing / controller | replaces `route_for` from version 1.x |
192
+ | [`be_routable`] | | routing / controller | usu. for `expect(...).not_to be_routable` |
193
+ | [`have_http_status`][] | | request / controller / feature | |
194
+ | [`match_array`][] | | all | for comparing arrays of ActiveRecord objects |
195
+ | [`have_been_enqueued`][] | | all | requires config: `ActiveJob::Base.queue_adapter = :test` |
196
+ | [`have_enqueued_job`][] | | all | requires config: `ActiveJob::Base.queue_adapter = :test` |
351
197
 
352
- View specs infer the controller name and path from the path to the view
353
- template. e.g. if the template is `events/index.html.erb` then:
198
+ Follow the links above for examples of how each matcher is used.
354
199
 
355
- ```ruby
356
- controller.controller_path == "events"
357
- controller.request.path_parameters[:controller] == "events"
358
- ```
200
+ [the matchers that come standard in RSpec]: https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers
201
+ [`be_a_new`]: https://relishapp.com/rspec/rspec-rails/docs/matchers/be-a-new-matcher
202
+ [`render_template`]: https://relishapp.com/rspec/rspec-rails/docs/matchers/render-template-matcher
203
+ [`redirect_to`]: https://relishapp.com/rspec/rspec-rails/docs/matchers/redirect-to-matcher
204
+ [`route_to`]: https://relishapp.com/rspec/rspec-rails/docs/routing-specs/route-to-matcher
205
+ [`be_routable`]: https://relishapp.com/rspec/rspec-rails/docs/routing-specs/be-routable-matcher
206
+ [`have_http_status`]: https://relishapp.com/rspec/rspec-rails/docs/matchers/have-http-status-matcher
207
+ [`match_array`]: https://relishapp.com/rspec/rspec-rails/docs/matchers/activerecord-relation-match-array
208
+ [`have_been_enqueued`]: https://relishapp.com/rspec/rspec-rails/docs/matchers/have-been-enqueued-matcher
209
+ [`have_enqueued_job`]: https://relishapp.com/rspec/rspec-rails/docs/matchers/have-enqueued-job-matcher
359
210
 
360
- This means that most of the time you don't need to set these values. When
361
- spec'ing a partial that is included across different controllers, you _may_
362
- need to override these values before rendering the view.
211
+ ### What else does RSpec Rails add?
363
212
 
364
- To provide a layout for the render, you'll need to specify _both_ the template
365
- and the layout explicitly. For example:
213
+ For a comprehensive look at RSpec Rails’ features,
214
+ read the [official Cucumber documentation][].
366
215
 
367
- ```ruby
368
- render :template => "events/show", :layout => "layouts/application"
369
- ```
216
+ [official Cucumber documentation]: https://relishapp.com/rspec/rspec-rails/docs
370
217
 
371
- ### `assign(key, val)`
218
+ ## What tests should I write?
372
219
 
373
- Use this to assign values to instance variables in the view:
220
+ RSpec Rails defines ten different _types_ of specs
221
+ for testing different parts of a typical Rails application.
222
+ Each one inherits from one of Rails’ built-in `TestCase` classes,
223
+ meaning the helper methods provided by default in Rails tests
224
+ are available in RSpec, as well.
374
225
 
375
- ```ruby
376
- assign(:widget, Widget.new)
377
- render
378
- ```
226
+ | Spec type | Corresponding Rails test class |
227
+ | -------------- | -------------------------------- |
228
+ | [model][] | |
229
+ | [controller][] | [`ActionController::TestCase`][] |
230
+ | [mailer][] | `ActionMailer::TestCase` |
231
+ | [job][] | |
232
+ | [view][] | `ActionView::TestCase` |
233
+ | [routing][] | |
234
+ | [helper][] | `ActionView::TestCase` |
235
+ | [request][] | [`ActionDispatch::IntegrationTest`][] |
236
+ | [feature][] | |
237
+ | [system][] | [`ActionDispatch::SystemTestCase`][] |
379
238
 
380
- The code above assigns `Widget.new` to the `@widget` variable in the view, and
381
- then renders the view.
239
+ Follow the links above to see examples of each spec type,
240
+ or for official Rails API documentation on the given `TestCase` class.
382
241
 
383
- Note that because view specs mix in `ActionView::TestCase` behavior, any
384
- instance variables you set will be transparently propagated into your views
385
- (similar to how instance variables you set in controller actions are made
386
- available in views). For example:
242
+ > **Note: This is not a checklist.**
243
+ >
244
+ > Ask a hundred developers how to test an application,
245
+ > and you’ll get a hundred different answers.
246
+ >
247
+ > RSpec Rails provides thoughtfully selected features
248
+ > to encourage good testing practices, but there’s no “right” way to do it.
249
+ > Ultimately, it’s up to you to decide how your test suite will be composed.
250
+
251
+ When creating a spec file,
252
+ assign it a type in the top-level `describe` block, like so:
387
253
 
388
254
  ```ruby
389
- @widget = Widget.new
390
- render # @widget is available inside the view
391
- ```
392
-
393
- RSpec doesn't officially support this pattern, which only works as a
394
- side-effect of the inclusion of `ActionView::TestCase`. Be aware that it may be
395
- made unavailable in the future.
396
-
397
- #### Upgrade note
398
-
399
- ```ruby
400
- # rspec-rails-1.x
401
- assigns[key] = value
402
-
403
- # rspec-rails-2.x+
404
- assign(key, value)
405
- ```
255
+ # spec/models/user_spec.rb
406
256
 
407
- ### `rendered`
408
-
409
- This represents the rendered view.
410
-
411
- ```ruby
412
- render
413
- expect(rendered).to match /Some text expected to appear on the page/
257
+ RSpec.describe User, type: :model do
258
+ ...
414
259
  ```
415
260
 
416
- #### Upgrade note
261
+ [request]: https://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec
262
+ [feature]: https://www.relishapp.com/rspec/rspec-rails/docs/feature-specs/feature-spec
263
+ [system]: https://relishapp.com/rspec/rspec-rails/docs/system-specs/system-spec
264
+ [model]: https://www.relishapp.com/rspec/rspec-rails/docs/model-specs
265
+ [controller]: https://www.relishapp.com/rspec/rspec-rails/docs/controller-specs
266
+ [mailer]: https://relishapp.com/rspec/rspec-rails/docs/mailer-specs
267
+ [job]: https://relishapp.com/rspec/rspec-rails/docs/job-specs/job-spec
268
+ [view]: https://www.relishapp.com/rspec/rspec-rails/docs/view-specs/view-spec
269
+ [routing]: https://www.relishapp.com/rspec/rspec-rails/docs/routing-specs
270
+ [helper]: https://www.relishapp.com/rspec/rspec-rails/docs/helper-specs/helper-spec
271
+ [`ActionDispatch::IntegrationTest`]: https://api.rubyonrails.org/classes/ActionDispatch/IntegrationTest.html
272
+ [`ActionDispatch::SystemTestCase`]: https://api.rubyonrails.org/classes/ActionDispatch/SystemTestCase.html
273
+ [`ActionController::TestCase`]: https://api.rubyonrails.org/classes/ActionController/TestCase.html
274
+ [in the appropriate folder]: https://relishapp.com/rspec/rspec-rails/docs/directory-structure
417
275
 
418
- ```ruby
419
- # rspec-rails-1.x
420
- render
421
- response.should xxx
276
+ ### System specs, feature specs, request specs–what’s the difference?
422
277
 
423
- # rspec-rails-2.x+
424
- render
425
- rendered.should xxx
278
+ RSpec Rails provides some end-to-end (entire application) testing capability
279
+ to specify the interaction with the client.
426
280
 
427
- # rspec-rails-2.x+ with expect syntax
428
- render
429
- expect(rendered).to xxx
430
- ```
281
+ #### System specs
431
282
 
432
- ## Routing specs
283
+ Also called **acceptance tests**, **browser tests**, or **end-to-end tests**,
284
+ system specs test the application from the perspective of a _human client._
285
+ The test code walks through a user’s browser interactions,
433
286
 
434
- Routing specs default to residing in the `spec/routing` folder. Tagging any
435
- context with the metadata `:type => :routing` treats its examples as routing
436
- specs.
287
+ * `visit '/login'`
288
+ * `fill_in 'Name', with: 'jdoe'`
437
289
 
438
- ```ruby
439
- require 'rails_helper'
440
-
441
- RSpec.describe "routing to profiles", :type => :routing do
442
- it "routes /profile/:username to profile#show for username" do
443
- expect(:get => "/profiles/jsmith").to route_to(
444
- :controller => "profiles",
445
- :action => "show",
446
- :username => "jsmith"
447
- )
448
- end
290
+ and the expectations revolve around page content.
449
291
 
450
- it "does not expose a list of profiles" do
451
- expect(:get => "/profiles").not_to be_routable
452
- end
453
- end
454
- ```
292
+ * `expect(page).to have_text('Welcome')`
455
293
 
456
- ### Upgrade note
294
+ Because system specs are a wrapper around Rails’ built-in `SystemTestCase`,
295
+ they’re only available on Rails 5.1+.
296
+ (Feature specs serve the same purpose, but without this dependency.)
457
297
 
458
- `route_for` from rspec-rails-1.x is gone. Use `route_to` and `be_routable`
459
- instead.
298
+ #### Feature specs
460
299
 
461
- ## Helper specs
300
+ Before Rails introduced system testing facilities,
301
+ feature specs were the only spec type for end-to-end testing.
302
+ While the RSpec team now [officially recommends system specs][] instead,
303
+ feature specs are still fully supported, look basically identical,
304
+ and work on older versions of Rails.
462
305
 
463
- Helper specs default to residing in the `spec/helpers` folder. Tagging any
464
- context with the metadata `:type => :helper` treats its examples as helper
465
- specs.
306
+ On the other hand, feature specs require non-trivial configuration
307
+ to get some important features working,
308
+ like JavaScript testing or making sure each test runs with a fresh DB state.
309
+ With system specs, this configuration is provided out-of-the-box.
466
310
 
467
- Helper specs mix in ActionView::TestCase::Behavior. A `helper` object is
468
- provided which mixes in the helper module being spec'd, along with
469
- `ApplicationHelper` (if present).
311
+ Like system specs, feature specs require the [Capybara][] gem.
312
+ Rails 5.1+ includes it by default as part of system tests,
313
+ but if you don’t have the luxury of upgrading,
314
+ be sure to add it to the `:test` group of your `Gemfile` first:
470
315
 
471
316
  ```ruby
472
- require 'rails_helper'
473
-
474
- RSpec.describe EventsHelper, :type => :helper do
475
- describe "#link_to_event" do
476
- it "displays the title, and formatted date" do
477
- event = Event.new("Ruby Kaigi", Date.new(2010, 8, 27))
478
- # helper is an instance of ActionView::Base configured with the
479
- # EventsHelper and all of Rails' built-in helpers
480
- expect(helper.link_to_event).to match /Ruby Kaigi, 27 Aug, 2010/
481
- end
482
- end
317
+ group :test do
318
+ gem "capybara"
483
319
  end
484
320
  ```
485
321
 
486
- ## Matchers
487
-
488
- Several domain-specific matchers are provided to each of the example group
489
- types. Most simply delegate to their equivalent Rails' assertions.
490
-
491
- ### `be_a_new`
492
-
493
- - Available in all specs
494
- - Primarily intended for controller specs
495
-
496
- ```ruby
497
- expect(object).to be_a_new(Widget)
498
- ```
499
-
500
- Passes if the object is a `Widget` and returns true for `new_record?`
322
+ [officially recommends system specs]: https://rspec.info/blog/2017/10/rspec-3-7-has-been-released/#rails-actiondispatchsystemtest-integration-system-specs
323
+ [Capybara]: https://github.com/teamcapybara/capybara
501
324
 
502
- ### `render_template`
325
+ #### Request specs
503
326
 
504
- - Delegates to Rails' `assert_template`
505
- - Available in request, controller, and view specs
327
+ Request specs are for testing the application
328
+ from the perspective of a _machine client._
329
+ They begin with an HTTP request and end with the HTTP response,
330
+ so they’re faster than feature specs,
331
+ but do not examine your app’s UI or JavaScript.
506
332
 
507
- In request and controller specs, apply to the `response` object:
333
+ Request specs provide a high-level alternative to controller specs.
334
+ In fact, as of RSpec 3.5, both the Rails and RSpec teams
335
+ [discourage directly testing controllers][]
336
+ in favor of functional tests like request specs.
508
337
 
509
- ```ruby
510
- expect(response).to render_template("new")
511
- ```
512
-
513
- In view specs, apply to the `view` object:
514
-
515
- ```ruby
516
- expect(view).to render_template(:partial => "_form", :locals => { :widget => widget } )
517
- ```
518
-
519
- ### `redirect_to`
520
-
521
- - Delegates to `assert_redirect`
522
- - Available in request and controller specs
523
-
524
- ```ruby
525
- expect(response).to redirect_to(widgets_path)
526
- ```
527
-
528
- ### `route_to`
529
-
530
- - Delegates to Rails' `assert_routing`
531
- - Available in routing and controller specs
532
-
533
- ```ruby
534
- expect(:get => "/widgets").to route_to(:controller => "widgets", :action => "index")
535
- ```
536
-
537
- ### `be_routable`
538
-
539
- Passes if the path is recognized by Rails' routing. This is primarily intended
540
- to be used with `not_to` to specify standard CRUD routes which should not be
541
- routable.
542
-
543
- ```ruby
544
- expect(:get => "/widgets/1/edit").not_to be_routable
545
- ```
546
-
547
- ### `have_http_status`
548
-
549
- - Passes if `response` has a matching HTTP status code
550
- - The following symbolic status codes are allowed:
551
- - `Rack::Utils::SYMBOL_TO_STATUS_CODE`
552
- - One of the defined `ActionDispatch::TestResponse` aliases:
553
- - `:error`
554
- - `:missing`
555
- - `:redirect`
556
- - `:success`
557
- - Available in controller, feature, and request specs.
558
-
559
- In controller and request specs, apply to the `response` object:
338
+ When writing them, try to answer the question,
339
+ “For a given HTTP request (verb + path + parameters),
340
+ what HTTP response should the application return?”
560
341
 
561
- ```ruby
562
- expect(response).to have_http_status(201)
563
- expect(response).not_to have_http_status(:created)
564
- ```
565
-
566
- In feature specs, apply to the `page` object:
342
+ [discourage directly testing controllers]: https://rspec.info/blog/2016/07/rspec-3-5-has-been-released/#rails-support-for-rails-5
567
343
 
568
- ```ruby
569
- expect(page).to have_http_status(:success)
570
- ```
571
-
572
- ## `rake` tasks
573
-
574
- Several rake tasks are provided as a convenience for working with RSpec. To run
575
- the entire spec suite use `rake spec`. To run a subset of specs use the
576
- associated type task, for example `rake spec:models`.
577
-
578
- A full list of the available rake tasks can be seen by running `rake -T | grep
579
- spec`.
344
+ ## Contributing
580
345
 
581
- ### Customizing `rake` tasks
346
+ - [Build details](BUILD_DETAIL.md)
347
+ - [Code of Conduct](CODE_OF_CONDUCT.md)
348
+ - [Detailed contributing guide](CONTRIBUTING.md)
582
349
 
583
- If you want to customize the behavior of `rake spec`, you may [define your own
584
- task in the `Rakefile` for your
585
- project](https://www.relishapp.com/rspec/rspec-core/docs/command-line/rake-task).
586
- However, you must first clear the task that rspec-rails defined:
350
+ Once you’ve cloned the repo and [set up the environment](DEVELOPMENT.md),
351
+ you can run the specs and Cucumber features, or submit a pull request.
587
352
 
588
- ```ruby
589
- task("spec").clear
590
- ```
353
+ ## See Also
591
354
 
355
+ ### RSpec base libraries
592
356
 
593
- ## Also see
357
+ * <https://github.com/rspec/rspec>
358
+ * <https://github.com/rspec/rspec-core>
359
+ * <https://github.com/rspec/rspec-expectations>
360
+ * <https://github.com/rspec/rspec-mocks>
594
361
 
595
- * [https://github.com/rspec/rspec](https://github.com/rspec/rspec)
596
- * [https://github.com/rspec/rspec-core](https://github.com/rspec/rspec-core)
597
- * [https://github.com/rspec/rspec-expectations](https://github.com/rspec/rspec-expectations)
598
- * [https://github.com/rspec/rspec-mocks](https://github.com/rspec/rspec-mocks)
362
+ ### Recommended third-party extensions
599
363
 
600
- ## Feature Requests & Bugs
364
+ * [FactoryBot](https://github.com/thoughtbot/factory_bot)
365
+ * [Capybara](https://github.com/jnicklas/capybara)
366
+ (Included by default in Rails 5.1+.
367
+ Note that [additional configuration is required][] to use the Capybara DSL
368
+ anywhere other than system specs and feature specs.)
601
369
 
602
- See <http://github.com/rspec/rspec-rails/issues>
370
+ [additional configuration is required]: https://rubydoc.info/gems/rspec-rails/file/Capybara.md
@@ -23,7 +23,7 @@ module Rspec
23
23
 
24
24
  def create_fixture_file
25
25
  return unless missing_fixture_replacement?
26
- template 'fixtures.yml', File.join('spec/fixtures', "#{table_name}.yml")
26
+ template 'fixtures.yml', File.join('spec/fixtures', class_path, "#{(pluralize_table_names? ? plural_file_name : file_name)}.yml")
27
27
  end
28
28
 
29
29
  private
@@ -15,7 +15,7 @@ module RSpec
15
15
  def failure_message
16
16
  message = "expected #{actual.inspect} to be valid"
17
17
 
18
- if actual.respond_to?(:errors)
18
+ if actual.respond_to?(:errors) && actual.method(:errors).arity < 1
19
19
  errors = if actual.errors.respond_to?(:full_messages)
20
20
  actual.errors.full_messages
21
21
  else
@@ -3,7 +3,7 @@ module RSpec
3
3
  # Version information for RSpec Rails.
4
4
  module Version
5
5
  # Current version of RSpec Rails, in semantic versioning format.
6
- STRING = '3.8.2'
6
+ STRING = '3.8.3'
7
7
  end
8
8
  end
9
9
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.8.2
4
+ version: 3.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Chelimsky
@@ -44,7 +44,7 @@ cert_chain:
44
44
  ZsVDj6a7lH3cNqtWXZxrb2wO38qV5AkYj8SQK7Hj3/Yui9myUX3crr+PdetazSqQ
45
45
  F3MdtaDehhjC
46
46
  -----END CERTIFICATE-----
47
- date: 2019-01-18 00:00:00.000000000 Z
47
+ date: 2019-10-09 00:00:00.000000000 Z
48
48
  dependencies:
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: activesupport
@@ -278,7 +278,7 @@ licenses:
278
278
  - MIT
279
279
  metadata:
280
280
  bug_tracker_uri: https://github.com/rspec/rspec-rails/issues
281
- changelog_uri: https://github.com/rspec/rspec-rails/blob/v3.8.2/Changelog.md
281
+ changelog_uri: https://github.com/rspec/rspec-rails/blob/v3.8.3/Changelog.md
282
282
  documentation_uri: https://rspec.info/documentation/
283
283
  mailing_list_uri: https://groups.google.com/forum/#!forum/rspec
284
284
  source_code_uri: https://github.com/rspec/rspec-rails
@@ -298,7 +298,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
298
298
  - !ruby/object:Gem::Version
299
299
  version: '0'
300
300
  requirements: []
301
- rubygems_version: 3.0.2
301
+ rubygems_version: 3.0.6
302
302
  signing_key:
303
303
  specification_version: 4
304
304
  summary: RSpec for Rails
metadata.gz.sig CHANGED
Binary file