shoulda-matchers 4.1.2 → 4.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/{MIT-LICENSE → LICENSE} +1 -1
- data/README.md +168 -86
- data/lib/shoulda/matchers/action_controller/callback_matcher.rb +4 -2
- data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +3 -2
- data/lib/shoulda/matchers/action_controller/permit_matcher.rb +26 -21
- data/lib/shoulda/matchers/action_controller/redirect_to_matcher.rb +6 -8
- data/lib/shoulda/matchers/action_controller/render_template_matcher.rb +6 -8
- data/lib/shoulda/matchers/action_controller/render_with_layout_matcher.rb +16 -13
- data/lib/shoulda/matchers/action_controller/rescue_from_matcher.rb +2 -1
- data/lib/shoulda/matchers/action_controller/route_matcher.rb +5 -6
- data/lib/shoulda/matchers/action_controller/route_params.rb +1 -1
- data/lib/shoulda/matchers/action_controller/set_session_or_flash_matcher.rb +19 -13
- data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +18 -16
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +31 -29
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_changed_value_error.rb +1 -1
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter.rb +5 -5
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator.rb +2 -2
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters.rb +1 -1
- data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setters_and_validators.rb +1 -1
- data/lib/shoulda/matchers/active_model/disallow_value_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_model/have_secure_password_matcher.rb +51 -25
- data/lib/shoulda/matchers/active_model/helpers.rb +1 -1
- data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +32 -30
- data/lib/shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_model/qualifiers/ignoring_interference_by_writer.rb +1 -1
- data/lib/shoulda/matchers/active_model/validate_absence_of_matcher.rb +9 -1
- data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +2 -2
- data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +9 -8
- data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +28 -46
- data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +33 -9
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +71 -26
- data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +2 -2
- data/lib/shoulda/matchers/active_model/validation_matcher.rb +31 -6
- data/lib/shoulda/matchers/active_model/validation_matcher/build_description.rb +2 -4
- data/lib/shoulda/matchers/active_model/validation_message_finder.rb +2 -4
- data/lib/shoulda/matchers/active_model/validator.rb +3 -3
- data/lib/shoulda/matchers/active_record.rb +26 -23
- data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +6 -3
- data/lib/shoulda/matchers/active_record/association_matcher.rb +100 -44
- data/lib/shoulda/matchers/active_record/association_matchers/counter_cache_matcher.rb +5 -2
- data/lib/shoulda/matchers/active_record/association_matchers/dependent_matcher.rb +4 -4
- data/lib/shoulda/matchers/active_record/association_matchers/inverse_of_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_record/association_matchers/join_table_matcher.rb +11 -6
- data/lib/shoulda/matchers/active_record/association_matchers/model_reflection.rb +14 -15
- data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +30 -8
- data/lib/shoulda/matchers/active_record/association_matchers/option_verifier.rb +23 -5
- data/lib/shoulda/matchers/active_record/association_matchers/optional_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_record/association_matchers/order_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_record/association_matchers/required_matcher.rb +3 -3
- data/lib/shoulda/matchers/active_record/association_matchers/source_matcher.rb +3 -2
- data/lib/shoulda/matchers/active_record/association_matchers/through_matcher.rb +7 -5
- data/lib/shoulda/matchers/active_record/define_enum_for_matcher.rb +8 -8
- data/lib/shoulda/matchers/active_record/have_attached_matcher.rb +185 -0
- data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +40 -18
- data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_record/have_implicit_order_column.rb +106 -0
- data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +12 -10
- data/lib/shoulda/matchers/active_record/have_rich_text_matcher.rb +83 -0
- data/lib/shoulda/matchers/active_record/have_secure_token_matcher.rb +30 -9
- data/lib/shoulda/matchers/active_record/serialize_matcher.rb +13 -9
- data/lib/shoulda/matchers/active_record/uniqueness.rb +1 -1
- data/lib/shoulda/matchers/active_record/uniqueness/test_model_creator.rb +1 -3
- data/lib/shoulda/matchers/active_record/uniqueness/test_models.rb +0 -2
- data/lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb +80 -73
- data/lib/shoulda/matchers/doublespeak.rb +2 -1
- data/lib/shoulda/matchers/doublespeak/double.rb +1 -1
- data/lib/shoulda/matchers/doublespeak/double_collection.rb +3 -3
- data/lib/shoulda/matchers/doublespeak/double_implementation_registry.rb +8 -5
- data/lib/shoulda/matchers/doublespeak/object_double.rb +1 -1
- data/lib/shoulda/matchers/doublespeak/stub_implementation.rb +1 -5
- data/lib/shoulda/matchers/doublespeak/world.rb +2 -2
- data/lib/shoulda/matchers/error.rb +1 -1
- data/lib/shoulda/matchers/independent.rb +0 -1
- data/lib/shoulda/matchers/independent/delegate_method_matcher.rb +14 -13
- data/lib/shoulda/matchers/integrations/configuration.rb +1 -1
- data/lib/shoulda/matchers/integrations/libraries/action_controller.rb +1 -1
- data/lib/shoulda/matchers/integrations/libraries/rails.rb +2 -2
- data/lib/shoulda/matchers/integrations/test_frameworks/active_support_test_case.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/minitest_4.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/minitest_5.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/missing_test_framework.rb +1 -1
- data/lib/shoulda/matchers/integrations/test_frameworks/test_unit.rb +1 -1
- data/lib/shoulda/matchers/rails_shim.rb +10 -21
- data/lib/shoulda/matchers/util.rb +16 -4
- data/lib/shoulda/matchers/util/word_wrap.rb +8 -8
- data/lib/shoulda/matchers/version.rb +1 -1
- data/lib/shoulda/matchers/warn.rb +3 -3
- data/shoulda-matchers.gemspec +10 -7
- metadata +11 -9
- data/lib/shoulda/matchers/independent/delegate_method_matcher/stubbed_target.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0268da0cff119fb6c9128b70f1826451b582bdc2495acf382f4e512a6636d0c8'
|
4
|
+
data.tar.gz: bf0698ed7605d8a8ef6b7e78bdc198bfa9502e1f2df134e3c5f524d1809b82da
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 407cc79fc367dd4f02b346a199a8d9a9c4ecc5f2d814b98b25989489d96fd2d02308459e2d3a086aeacd67cbd5a9e91e7e237f3fe04efb64c196307dd53abe71
|
7
|
+
data.tar.gz: a4eb04356408c22c7606ef403e1d4a042461e5323a9459875ad6a67f9f5cbc2944dee295d6086e6f1bea5b1d4fd7cace0fc5b701a4ba0199c75f7f002939f47a
|
data/{MIT-LICENSE → LICENSE}
RENAMED
data/README.md
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
# Shoulda Matchers [![Gem Version][version-badge]][rubygems] [![Build Status][travis-badge]][travis] ![Downloads][downloads-
|
1
|
+
# Shoulda Matchers [![Gem Version][version-badge]][rubygems] [![Build Status][travis-badge]][travis] [![Total Downloads][downloads-total]][rubygems] [![Downloads][downloads-badge]][rubygems]
|
2
2
|
|
3
3
|
[version-badge]: https://img.shields.io/gem/v/shoulda-matchers.svg
|
4
4
|
[rubygems]: https://rubygems.org/gems/shoulda-matchers
|
5
5
|
[travis-badge]: https://img.shields.io/travis/thoughtbot/shoulda-matchers/master.svg
|
6
6
|
[travis]: https://travis-ci.org/thoughtbot/shoulda-matchers
|
7
|
+
[downloads-total]: https://img.shields.io/gem/dt/shoulda-matchers.svg
|
8
|
+
[downloads-badge]: https://img.shields.io/gem/dtv/shoulda-matchers.svg
|
7
9
|
[downloads-badge]: https://img.shields.io/gem/dtv/shoulda-matchers.svg
|
8
|
-
[hound-badge]: https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg
|
9
|
-
[hound]: https://houndci.com
|
10
10
|
|
11
11
|
[![shoulda-matchers][logo]][website]
|
12
12
|
|
@@ -19,11 +19,11 @@ complex, and error-prone.
|
|
19
19
|
|
20
20
|
## Quick links
|
21
21
|
|
22
|
-
📖 **[Read the documentation for the latest version
|
23
|
-
📢 **[See what's changed in
|
22
|
+
📖 **[Read the documentation for the latest version][rubydocs].**
|
23
|
+
📢 **[See what's changed in recent versions][changelog].**
|
24
24
|
|
25
|
-
[rubydocs]:
|
26
|
-
[
|
25
|
+
[rubydocs]: https://matchers.shoulda.io/docs
|
26
|
+
[changelog]: CHANGELOG.md
|
27
27
|
|
28
28
|
## Table of contents
|
29
29
|
|
@@ -39,10 +39,12 @@ complex, and error-prone.
|
|
39
39
|
* [ActiveRecord matchers](#activerecord-matchers)
|
40
40
|
* [ActionController matchers](#actioncontroller-matchers)
|
41
41
|
* [Independent matchers](#independent-matchers)
|
42
|
-
* [
|
42
|
+
* [Extensions](#extensions)
|
43
43
|
* [Contributing](#contributing)
|
44
|
+
* [Compatibility](#compatibility)
|
44
45
|
* [Versioning](#versioning)
|
45
|
-
* [
|
46
|
+
* [Team](#team)
|
47
|
+
* [Copyright/License](#copyright-license)
|
46
48
|
* [About thoughtbot](#about-thoughtbot)
|
47
49
|
|
48
50
|
## Getting started
|
@@ -53,21 +55,21 @@ Start by including `shoulda-matchers` in your Gemfile:
|
|
53
55
|
|
54
56
|
```ruby
|
55
57
|
group :test do
|
56
|
-
gem 'shoulda-matchers'
|
58
|
+
gem 'shoulda-matchers', '~> 4.0'
|
57
59
|
end
|
58
60
|
```
|
59
61
|
|
60
|
-
|
62
|
+
Then run `bundle install`.
|
61
63
|
|
62
|
-
|
63
|
-
* Which portion of the matchers you want to use
|
64
|
+
Now you need to configure the gem by telling it:
|
64
65
|
|
65
|
-
|
66
|
-
|
66
|
+
* which matchers you want to use in your tests
|
67
|
+
* that you're using RSpec so that it can make those matchers available in
|
68
|
+
your example groups
|
67
69
|
|
68
70
|
#### Rails apps
|
69
71
|
|
70
|
-
|
72
|
+
If you're working on a Rails app, simply place this at the bottom of
|
71
73
|
`spec/rails_helper.rb` (or in a support file if you so choose):
|
72
74
|
|
73
75
|
```ruby
|
@@ -79,13 +81,12 @@ Shoulda::Matchers.configure do |config|
|
|
79
81
|
end
|
80
82
|
```
|
81
83
|
|
82
|
-
Now you're ready to [use matchers in your tests](#usage)!
|
83
|
-
|
84
84
|
#### Non-Rails apps
|
85
85
|
|
86
|
-
If
|
87
|
-
ActiveModel, you can still use this gem too! In that case,
|
88
|
-
the following configuration at the bottom of
|
86
|
+
If you're not working on a Rails app, but you still make use of ActiveRecord or
|
87
|
+
ActiveModel in your project, you can still use this gem too! In that case,
|
88
|
+
you'll want to place the following configuration at the bottom of
|
89
|
+
`spec/spec_helper.rb`:
|
89
90
|
|
90
91
|
```ruby
|
91
92
|
Shoulda::Matchers.configure do |config|
|
@@ -99,45 +100,83 @@ Shoulda::Matchers.configure do |config|
|
|
99
100
|
end
|
100
101
|
```
|
101
102
|
|
102
|
-
Now you're ready to [use matchers in your tests](#usage)!
|
103
|
-
|
104
103
|
### Minitest
|
105
104
|
|
106
|
-
|
107
|
-
|
108
|
-
|
105
|
+
If you're using our umbrella gem [Shoulda], then make sure that you're using the
|
106
|
+
latest version:
|
107
|
+
|
108
|
+
```ruby
|
109
|
+
group :test do
|
110
|
+
gem 'shoulda', '~> 4.0'
|
111
|
+
end
|
112
|
+
```
|
109
113
|
|
110
|
-
[
|
111
|
-
[shoulda-context]: https://github.com/thoughtbot/shoulda-context
|
114
|
+
[Shoulda]: https://github.com/thoughtbot/shoulda
|
112
115
|
|
113
|
-
|
114
|
-
and 4.x, so you'll want to add the following to your Gemfile:
|
116
|
+
Otherwise, add `shoulda-matchers` to your Gemfile:
|
115
117
|
|
116
118
|
```ruby
|
117
119
|
group :test do
|
118
|
-
gem 'shoulda', '~>
|
119
|
-
gem 'shoulda-matchers', '~> 2.0'
|
120
|
-
gem 'rails-controller-testing'
|
120
|
+
gem 'shoulda-matchers', '~> 4.0'
|
121
121
|
end
|
122
122
|
```
|
123
123
|
|
124
|
-
|
124
|
+
Then run `bundle install`.
|
125
|
+
|
126
|
+
Now you need to configure the gem by telling it:
|
127
|
+
|
128
|
+
* which matchers you want to use in your tests
|
129
|
+
* that you're using Minitest so that it can make those matchers available in
|
130
|
+
your test case classes
|
131
|
+
|
132
|
+
#### Rails apps
|
133
|
+
|
134
|
+
If you're working on a Rails app, simply place this at the bottom of
|
135
|
+
`test/test_helper.rb`:
|
136
|
+
|
137
|
+
```ruby
|
138
|
+
Shoulda::Matchers.configure do |config|
|
139
|
+
config.integrate do |with|
|
140
|
+
with.test_framework :minitest
|
141
|
+
with.library :rails
|
142
|
+
end
|
143
|
+
end
|
144
|
+
```
|
145
|
+
|
146
|
+
#### Non-Rails apps
|
147
|
+
|
148
|
+
If you're not working on a Rails app, but you still make use of ActiveRecord or
|
149
|
+
ActiveModel in your project, you can still use this gem too! In that case,
|
150
|
+
you'll want to place the following configuration at the bottom of
|
151
|
+
`test/test_helper.rb`:
|
152
|
+
|
153
|
+
```ruby
|
154
|
+
Shoulda::Matchers.configure do |config|
|
155
|
+
config.integrate do |with|
|
156
|
+
with.test_framework :minitest
|
157
|
+
|
158
|
+
# Keep as many of these lines as are necessary:
|
159
|
+
with.library :active_record
|
160
|
+
with.library :active_model
|
161
|
+
end
|
162
|
+
end
|
163
|
+
```
|
125
164
|
|
126
165
|
## Usage
|
127
166
|
|
128
|
-
|
129
|
-
|
167
|
+
Most of the matchers provided by this gem are useful in a Rails context, and as
|
168
|
+
such, can be used for different parts of a Rails app:
|
130
169
|
|
131
170
|
* [database models backed by ActiveRecord](#activemodel-matchers)
|
132
171
|
* [non-database models, form objects, etc. backed by
|
133
172
|
ActiveModel](#activerecord-matchers)
|
134
173
|
* [controllers](#actioncontroller-matchers)
|
135
174
|
* [routes](#routing-matchers) (RSpec only)
|
136
|
-
* [
|
175
|
+
* [Rails-specific features like `delegate`](#independent-matchers)
|
137
176
|
|
138
|
-
|
139
|
-
|
140
|
-
test case may look something like:
|
177
|
+
As the name of the gem indicates, most matchers are designed to be used in
|
178
|
+
"one-liner" form using the `should` macro, a special directive available in both
|
179
|
+
RSpec and [Shoulda]. For instance, a model test case may look something like:
|
141
180
|
|
142
181
|
``` ruby
|
143
182
|
# RSpec
|
@@ -165,16 +204,17 @@ class MenuItemTest < ActiveSupport::TestCase
|
|
165
204
|
end
|
166
205
|
```
|
167
206
|
|
168
|
-
|
207
|
+
[See below](#matchers) for the full set of matchers that you can use.
|
169
208
|
|
170
209
|
### On the subject of `subject`
|
171
210
|
|
172
211
|
For both RSpec and Shoulda, the **subject** is an implicit reference to the
|
173
|
-
object under test, and
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
212
|
+
object under test, and through the use of `should` as demonstrated above, all of
|
213
|
+
the matchers make use of `subject` internally when they are run. A `subject` is
|
214
|
+
always set automatically by your test framework in any given test case; however,
|
215
|
+
in certain cases it can be advantageous to override it. For instance, when
|
216
|
+
testing validations in a model, it is customary to provide a valid model instead
|
217
|
+
of a fresh one:
|
178
218
|
|
179
219
|
``` ruby
|
180
220
|
# RSpec
|
@@ -232,11 +272,19 @@ end
|
|
232
272
|
|
233
273
|
### Availability of RSpec matchers in example groups
|
234
274
|
|
275
|
+
#### Rails projects
|
276
|
+
|
235
277
|
If you're using RSpec, then you're probably familiar with the concept of example
|
236
|
-
groups
|
237
|
-
|
238
|
-
|
239
|
-
groups
|
278
|
+
groups. Example groups can be assigned tags order to assign different behavior
|
279
|
+
to different kinds of example groups. This comes into play especially when using
|
280
|
+
`rspec-rails`, where, for instance, controller example groups, tagged with
|
281
|
+
`type: :controller`, are written differently than request example groups, tagged
|
282
|
+
with `type: :request`. This difference in writing style arises because
|
283
|
+
`rspec-rails` mixes different behavior and methods into controller example
|
284
|
+
groups vs. request example groups.
|
285
|
+
|
286
|
+
Relying on this behavior, Shoulda Matchers automatically makes certain matchers
|
287
|
+
available in certain kinds of example groups:
|
240
288
|
|
241
289
|
* ActiveRecord and ActiveModel matchers are available only in model example
|
242
290
|
groups, i.e., those tagged with `type: :model` or in files located under
|
@@ -248,13 +296,27 @@ groups:
|
|
248
296
|
tagged with `type: :routing` or in files located under `spec/routing`.
|
249
297
|
* Independent matchers are available in all example groups.
|
250
298
|
|
251
|
-
As long as you're using Rails, you don't need to worry about
|
252
|
-
should "just work".
|
299
|
+
As long as you're using Rails, you don't need to worry about these details —
|
300
|
+
everything should "just work".
|
301
|
+
|
302
|
+
#### Non-Rails projects
|
253
303
|
|
254
|
-
**
|
255
|
-
you want to use model matchers in certain example
|
256
|
-
manually include the module that holds those matchers
|
257
|
-
|
304
|
+
**What if you are using ActiveModel or ActiveRecord outside of Rails, however,
|
305
|
+
and you want to use model matchers in a certain example group?** Then you'll
|
306
|
+
need to manually include the module that holds those matchers into that example
|
307
|
+
group. For instance, you might have to say:
|
308
|
+
|
309
|
+
``` ruby
|
310
|
+
RSpec.describe MySpecialModel do
|
311
|
+
include Shoulda::Matchers::ActiveModel
|
312
|
+
include Shoulda::Matchers::ActiveRecord
|
313
|
+
end
|
314
|
+
```
|
315
|
+
|
316
|
+
If you have a lot of similar example groups in which you need to do this, then
|
317
|
+
you might find it more helpful to tag your example groups appropriately, then
|
318
|
+
instruct RSpec to mix these modules into any example groups that have that tag.
|
319
|
+
For instance, you could add this to your `rails_helper.rb`:
|
258
320
|
|
259
321
|
```ruby
|
260
322
|
RSpec.configure do |config|
|
@@ -263,21 +325,20 @@ RSpec.configure do |config|
|
|
263
325
|
end
|
264
326
|
```
|
265
327
|
|
266
|
-
|
328
|
+
And from then on, you could say:
|
267
329
|
|
268
330
|
```ruby
|
269
|
-
describe MySpecialModel, type: :model do
|
331
|
+
RSpec.describe MySpecialModel, type: :model do
|
270
332
|
# ...
|
271
333
|
end
|
272
334
|
```
|
273
335
|
|
274
336
|
### `should` vs `is_expected.to`
|
275
337
|
|
276
|
-
In this README and throughout the documentation,
|
277
|
-
of RSpec's one-liner syntax over `is_expected.to`.
|
278
|
-
|
279
|
-
|
280
|
-
can do that too:
|
338
|
+
In this README and throughout the documentation, you'll notice that we use the
|
339
|
+
`should` form of RSpec's one-liner syntax over `is_expected.to`. Beside being
|
340
|
+
the namesake of the gem itself, this is our preferred syntax as it's short and
|
341
|
+
sweet. But if you prefer to use `is_expected.to`, you can do that too:
|
281
342
|
|
282
343
|
```ruby
|
283
344
|
RSpec.describe Person, type: :model do
|
@@ -287,7 +348,7 @@ end
|
|
287
348
|
|
288
349
|
## Matchers
|
289
350
|
|
290
|
-
|
351
|
+
Here is the full list of matchers that ship with this gem. If you need details
|
291
352
|
about any of them, make sure to [consult the documentation][rubydocs]!
|
292
353
|
|
293
354
|
### ActiveModel matchers
|
@@ -322,18 +383,26 @@ about any of them, make sure to [consult the documentation][rubydocs]!
|
|
322
383
|
tests your `belongs_to` associations.
|
323
384
|
* **[define_enum_for](lib/shoulda/matchers/active_record/define_enum_for_matcher.rb)**
|
324
385
|
tests usage of the `enum` macro.
|
325
|
-
* **[have_and_belong_to_many](lib/shoulda/matchers/active_record/association_matcher.rb)**
|
386
|
+
* **[have_and_belong_to_many](lib/shoulda/matchers/active_record/association_matcher.rb#L827)**
|
326
387
|
tests your `has_and_belongs_to_many` associations.
|
327
388
|
* **[have_db_column](lib/shoulda/matchers/active_record/have_db_column_matcher.rb)**
|
328
389
|
tests that the table that backs your model has a specific column.
|
329
390
|
* **[have_db_index](lib/shoulda/matchers/active_record/have_db_index_matcher.rb)**
|
330
391
|
tests that the table that backs your model has an index on a specific column.
|
331
|
-
* **[
|
392
|
+
* **[have_implicit_order_column](lib/shoulda/matchers/active_record/have_implicit_order_column.rb)**
|
393
|
+
tests usage of `implicit_order_column`.
|
394
|
+
* **[have_many](lib/shoulda/matchers/active_record/association_matcher.rb#L328)**
|
332
395
|
tests your `has_many` associations.
|
333
|
-
* **[
|
396
|
+
* **[have_many_attached](lib/shoulda/matchers/active_record/have_attached_matcher.rb)**
|
397
|
+
tests your `has_many_attached` associations.
|
398
|
+
* **[have_one](lib/shoulda/matchers/active_record/association_matcher.rb#L598)**
|
334
399
|
tests your `has_one` associations.
|
400
|
+
* **[have_one_attached](lib/shoulda/matchers/active_record/have_attached_matcher.rb)**
|
401
|
+
tests your `has_one_attached` associations.
|
335
402
|
* **[have_readonly_attribute](lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb)**
|
336
403
|
tests usage of the `attr_readonly` macro.
|
404
|
+
* **[have_rich_text](lib/shoulda/matchers/active_record/have_rich_text_matcher.rb)**
|
405
|
+
tests your `has_rich_text` associations.
|
337
406
|
* **[serialize](lib/shoulda/matchers/active_record/serialize_matcher.rb)** tests
|
338
407
|
usage of the `serialize` macro.
|
339
408
|
* **[validate_uniqueness_of](lib/shoulda/matchers/active_record/validate_uniqueness_of_matcher.rb)**
|
@@ -379,37 +448,51 @@ about any of them, make sure to [consult the documentation][rubydocs]!
|
|
379
448
|
tests that an object forwards messages to other, internal objects by way of
|
380
449
|
delegation.
|
381
450
|
|
382
|
-
##
|
451
|
+
## Extensions
|
383
452
|
|
384
|
-
|
385
|
-
|
453
|
+
Over time our community has created extensions to Shoulda Matchers. If you've
|
454
|
+
created something that you want to share, please [let us know][new-issue]!
|
386
455
|
|
387
|
-
|
456
|
+
* **[shoulda-matchers-cucumber]** – Adds support for using Shoulda Matchers in
|
457
|
+
Cucumber tests.
|
388
458
|
|
389
|
-
[
|
459
|
+
[new-issue]: https://github.com/thoughtbot/shoulda-matchers/issues/new
|
460
|
+
[shoulda-matchers-cucumber]: https://github.com/majioa/shoulda-matchers-cucumber
|
390
461
|
|
391
462
|
## Contributing
|
392
463
|
|
393
|
-
|
394
|
-
|
464
|
+
Have a fix for a problem you've been running into or an idea for a new feature
|
465
|
+
you think would be useful? Take a look at the [Contributing
|
466
|
+
document](CONTRIBUTING.md) for instructions on setting up the repo on your
|
467
|
+
machine, understanding the codebase, and creating a good pull request.
|
395
468
|
|
396
|
-
|
469
|
+
## Compatibility
|
397
470
|
|
398
|
-
|
399
|
-
|
400
|
-
|
471
|
+
Shoulda Matchers is [tested][travis] and supported against Ruby 2.4+, Rails
|
472
|
+
4.2+, RSpec 3.x, and Minitest 5.x.
|
473
|
+
|
474
|
+
For Ruby < 2.4 and Rails < 4.1 compatibility, please use [v3.1.3][v3.1.3].
|
475
|
+
|
476
|
+
[v3.1.3]: https://github.com/thoughtbot/shoulda-matchers/tree/v3.1.3
|
401
477
|
|
402
478
|
## Versioning
|
403
479
|
|
404
480
|
Shoulda Matchers follows Semantic Versioning 2.0 as defined at
|
405
|
-
<
|
481
|
+
<https://semver.org>.
|
482
|
+
|
483
|
+
## Team
|
484
|
+
|
485
|
+
Shoulda Matchers is maintained by [Elliot Winkler][mcmire] and [Gui
|
486
|
+
Albuk][guialbuk].
|
487
|
+
|
488
|
+
[mcmire]: https://github.com/mcmire
|
489
|
+
[guialbuk]: https://github.com/guialbuk
|
406
490
|
|
407
|
-
## License
|
491
|
+
## Copyright/License
|
408
492
|
|
409
|
-
Shoulda Matchers is copyright © 2006-
|
410
|
-
|
411
|
-
|
412
|
-
[MIT-LICENSE](MIT-LICENSE) file.
|
493
|
+
Shoulda Matchers is copyright © 2006-2021 Tammer Saleh and [thoughtbot,
|
494
|
+
inc][thoughtbot-website]. It is free and opensource software and may be
|
495
|
+
redistributed under the terms specified in the [LICENSE](LICENSE) file.
|
413
496
|
|
414
497
|
[thoughtbot-website]: https://thoughtbot.com
|
415
498
|
|
@@ -419,8 +502,7 @@ and may be redistributed under the terms specified in the
|
|
419
502
|
|
420
503
|
[thoughtbot-logo]: https://presskit.thoughtbot.com/images/thoughtbot-logo-for-readmes.svg
|
421
504
|
|
422
|
-
|
423
|
-
logos for thoughtbot are trademarks of thoughtbot, inc.
|
505
|
+
The names and logos for thoughtbot are trademarks of thoughtbot, inc.
|
424
506
|
|
425
507
|
We are passionate about open source software. See [our other
|
426
508
|
projects][community]. We are [available for hire][hire].
|
@@ -179,11 +179,13 @@ module Shoulda
|
|
179
179
|
end
|
180
180
|
|
181
181
|
def failure_message
|
182
|
-
"Expected that #{controller_class.name} would have :#{method_name}
|
182
|
+
"Expected that #{controller_class.name} would have :#{method_name}"\
|
183
|
+
" as a #{kind}_#{callback_type}"
|
183
184
|
end
|
184
185
|
|
185
186
|
def failure_message_when_negated
|
186
|
-
"Expected that #{controller_class.name} would not have
|
187
|
+
"Expected that #{controller_class.name} would not have"\
|
188
|
+
" :#{method_name} as a #{kind}_#{callback_type}"
|
187
189
|
end
|
188
190
|
|
189
191
|
def description
|