mongoid-rspec 2.1.0 → 4.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (66) hide show
  1. checksums.yaml +5 -5
  2. data/LICENSE +1 -1
  3. data/README.md +222 -102
  4. data/Rakefile +8 -5
  5. data/lib/matchers/accept_nested_attributes.rb +22 -23
  6. data/lib/matchers/allow_mass_assignment.rb +12 -12
  7. data/lib/matchers/associations.rb +85 -49
  8. data/lib/matchers/be_dynamic_document.rb +26 -0
  9. data/lib/matchers/be_mongoid_document.rb +26 -0
  10. data/lib/matchers/be_stored_in.rb +55 -0
  11. data/lib/matchers/have_field.rb +90 -0
  12. data/lib/matchers/have_timestamps.rb +61 -0
  13. data/lib/matchers/indexes/have_index_for.rb +16 -0
  14. data/lib/matchers/indexes/v3/have_index_for.rb +59 -0
  15. data/lib/matchers/indexes/v4/have_index_for.rb +54 -0
  16. data/lib/matchers/validations.rb +30 -11
  17. data/lib/matchers/validations/absence_of.rb +11 -0
  18. data/lib/matchers/validations/associated.rb +1 -1
  19. data/lib/matchers/validations/confirmation_of.rb +7 -1
  20. data/lib/matchers/validations/custom_validation_of.rb +1 -4
  21. data/lib/matchers/validations/exclusion_of.rb +5 -5
  22. data/lib/matchers/validations/format_of.rb +2 -2
  23. data/lib/matchers/validations/inclusion_of.rb +5 -5
  24. data/lib/matchers/validations/length_of.rb +13 -35
  25. data/lib/matchers/validations/numericality_of.rb +32 -16
  26. data/lib/matchers/validations/presence_of.rb +1 -1
  27. data/lib/matchers/validations/uniqueness_of.rb +7 -10
  28. data/lib/mongoid-rspec.rb +1 -33
  29. data/lib/mongoid/rspec.rb +46 -0
  30. data/lib/mongoid/rspec/version.rb +5 -0
  31. data/spec/models/article.rb +9 -6
  32. data/spec/models/comment.rb +1 -1
  33. data/spec/models/log.rb +3 -3
  34. data/spec/models/message.rb +17 -0
  35. data/spec/models/movie_article.rb +1 -2
  36. data/spec/models/person.rb +1 -1
  37. data/spec/models/profile.rb +2 -2
  38. data/spec/models/record.rb +1 -1
  39. data/spec/models/site.rb +5 -1
  40. data/spec/models/user.rb +12 -10
  41. data/spec/spec_helper.rb +12 -10
  42. data/spec/unit/accept_nested_attributes_spec.rb +1 -1
  43. data/spec/unit/associations_spec.rb +19 -7
  44. data/spec/unit/be_dynamic_document_spec.rb +21 -0
  45. data/spec/unit/be_mongoid_document_spec.rb +25 -0
  46. data/spec/unit/be_stored_in.rb +54 -0
  47. data/spec/unit/document_spec.rb +5 -14
  48. data/spec/unit/have_index_for_spec.rb +46 -0
  49. data/spec/unit/have_timestamps_spec.rb +71 -0
  50. data/spec/unit/validations_spec.rb +23 -14
  51. data/spec/validators/ssn_validator.rb +6 -6
  52. metadata +119 -43
  53. data/.document +0 -5
  54. data/.gitignore +0 -6
  55. data/.ruby-gemset +0 -1
  56. data/.ruby-version +0 -1
  57. data/.travis.yml +0 -10
  58. data/Gemfile +0 -4
  59. data/lib/matchers/collections.rb +0 -9
  60. data/lib/matchers/document.rb +0 -173
  61. data/lib/matchers/indexes.rb +0 -69
  62. data/lib/matchers/validations/with_message.rb +0 -27
  63. data/lib/mongoid-rspec/version.rb +0 -5
  64. data/mongoid-rspec.gemspec +0 -25
  65. data/spec/unit/collections_spec.rb +0 -7
  66. data/spec/unit/indexes_spec.rb +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 644aca9f2b61c8979ce8eb90856a3d7db324e506
4
- data.tar.gz: 8f428ac11869473c94207866056850ceb113246a
2
+ SHA256:
3
+ metadata.gz: 6c59448b4e72ebb718332a28e7ddf77de5b792a09ea273b75959930e2c6c2918
4
+ data.tar.gz: b1818ed7a513db7a4e31bcdd5a492504a75becfc866dd95505192da1db7a56cc
5
5
  SHA512:
6
- metadata.gz: bb156c8186d891023ed5b423635aef4c673b150728372648cec95de064c72bc7fea35007ea1895d4002f880d787779dddcd9be0ce6304b68dfcdf0554a8aa8d6
7
- data.tar.gz: 83b4e63454cc912622c081fc67b0ff0185bb4b612676ad9ec2e7c7240d39f066fa94fe023066a968ca3c848ac21df4dcfd84c6b29c595894ecb7e35dc716f2e6
6
+ metadata.gz: 995c284d71146d52d554e8eff18e48605e76546ebce9428674d1fcefe4c560a73973651f4eb4496d21a839fb35944c37f98cc21eb78ddd1e1eea80a57d1392c4
7
+ data.tar.gz: a2e400ead572f31c614a294f1d5d10116e08fa6f152b2f58cf112da45608a3d72be2c5893ceb035c8a6f514af8ef55bcfdffd0a55a81a2e0f97ad43fd0699cf2
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2009 Evan Sagge
1
+ Copyright (c) 2009-2018 Evan Sagge and Contributors
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,47 +1,219 @@
1
- # mongoid-rspec
1
+ # [mongoid-rspec](https://github.com/mongoid/mongoid-rspec "A collection of RSpec-compatible matchers that help to test Mongoid documents.")
2
2
 
3
- [![Build Status][travis_badge]][travis]
4
- [![Gem Version][rubygems_badge]][rubygems]
5
- [![Code Climate][codeclimate_badge]][codeclimate]
3
+ [![Build Status](https://travis-ci.org/mongoid/mongoid-rspec.svg?branch=master)](https://travis-ci.org/mongoid/mongoid-rspec)
4
+ [![Gem Version](https://badge.fury.io/rb/mongoid-rspec.svg)](https://badge.fury.io/rb/mongoid-rspec)
6
5
 
7
- mongoid-rspec provides a collection of RSpec-compatible matchers that help to test mongoid documents.
6
+ The mongoid-rspec library provides a collection of RSpec-compatible matchers that help to test Mongoid documents.
8
7
 
9
8
  ## Installation
10
9
 
11
- ### With Mongoid 4.x
10
+ Drop this line into your Gemfile:
12
11
 
13
- Use mongoid-rspec [2.1.0][mongoid4]
12
+ ```ruby
13
+ group :test do
14
+ gem 'mongoid-rspec'
15
+ end
14
16
 
15
- gem 'mongoid-rspec', '~> 2.1.0'
17
+ ```
16
18
 
17
- ### With Mongoid 3.x
19
+ ## Compatibility
18
20
 
19
- Use mongoid-rspec [1.13.0][mongoid3].
21
+ This gem is compatible with Mongoid 3, 4, 5, 6 and 7.
20
22
 
21
- gem 'mongoid-rspec', '~> 1.13.0'
23
+ ## Configuration
22
24
 
23
- ### With Mongoid 2.x
25
+ ### Rails
24
26
 
25
- Use mongoid-rspec [1.4.5][mongoid2]
27
+ Add to your `rails_helper.rb` file
26
28
 
27
- gem 'mongoid-rspec', '1.4.5'
29
+ ```ruby
30
+ require 'mongoid-rspec'
28
31
 
29
- ### Configuring
32
+ RSpec.configure do |config|
33
+ config.include Mongoid::Matchers, type: :model
34
+ end
35
+ ```
36
+
37
+ ### Other
30
38
 
31
- Drop in existing or dedicated support file in spec/support.
32
- i.e: `spec/support/mongoid.rb`
39
+ Add to your `spec_helper.rb` file.
33
40
 
34
41
  ```ruby
42
+ require 'mongoid-rspec'
43
+
35
44
  RSpec.configure do |config|
36
- config.include Mongoid::Matchers, type: :model
45
+ config.include Mongoid::Matchers
37
46
  end
38
47
  ```
39
48
 
40
- If you aren't using rails then you don't have to specify the type.
41
- If you want to know why visit [the rspec documentation](https://relishapp.com/rspec/rspec-rails/docs/directory-structure).
42
-
43
49
  ## Matchers
44
50
 
51
+ ### be_mongoid_document
52
+
53
+ ```ruby
54
+ class Post
55
+ include Mongoid::Document
56
+ end
57
+
58
+ RSpec.describe Post, type: :model do
59
+ it { is_expected.to be_mongoid_document }
60
+ end
61
+ ```
62
+
63
+ ### be_dynamic_document
64
+
65
+ ```ruby
66
+ class User
67
+ include Mongoid::Document
68
+ include Mongoid::Attributes::Dynamic
69
+ end
70
+
71
+ RSpec.describe User, type: :model do
72
+ it { is_expected.to be_dynamic_document }
73
+ end
74
+ ```
75
+
76
+ ### have_timestamps
77
+
78
+ With full timestamps.
79
+
80
+ ```ruby
81
+ class Log
82
+ include Mongoid::Document
83
+ include Mongoid::Timestamps
84
+ end
85
+
86
+ RSpec.describe Log, type: :model do
87
+ it { is_expected.to have_timestamps }
88
+ end
89
+ ```
90
+
91
+ With short timestamps.
92
+
93
+ ```ruby
94
+ class User
95
+ include Mongoid::Document
96
+ include Mongoid::Timestamps::Short
97
+ end
98
+
99
+ RSpec.describe User, type: :model do
100
+ it { is_expected.to have_timestamps.shortened }
101
+ end
102
+ ```
103
+
104
+ With only creating or updating timestamps.
105
+
106
+ ```ruby
107
+ class Admin
108
+ include Mongoid::Document
109
+ include Mongoid::Timestamps::Create
110
+ include Mongoid::Timestamps::Update
111
+ end
112
+
113
+ RSpec.describe Admin, type: :model do
114
+ it { is_expected.to have_timestamps.for(:creating) }
115
+ it { is_expected.to have_timestamps.for(:updating) }
116
+ end
117
+ ```
118
+
119
+ With short creating or updating timestamps.
120
+
121
+ ```ruby
122
+ class Post
123
+ include Mongoid::Document
124
+ include Mongoid::Timestamps::Create::Short
125
+ end
126
+
127
+ RSpec.describe Short, type: :model do
128
+ it { is_expected.to have_timestamps.for(:creating).shortened }
129
+ end
130
+ ```
131
+
132
+ ### be_stored_in
133
+
134
+ ```ruby
135
+ class Post
136
+ include Mongoid::Document
137
+
138
+ store_in database: 'db1', collection: 'messages', client: 'secondary'
139
+ end
140
+
141
+ RSpec.describe Post, type: :model do
142
+ it { is_expected.to be_stored_in(database: 'db1', collection: 'messages', client: 'secondary') }
143
+ end
144
+ ```
145
+
146
+ It checks only those options, that you specify. For instance, test in example below will pass, even though expectation contains only `database` option.
147
+
148
+ ```ruby
149
+ class Comment
150
+ include Mongoid::Document
151
+
152
+ store_in database: 'db2', collection: 'messages'
153
+ end
154
+
155
+ RSpec.describe Comment, type: :model do
156
+ it { is_expected.to be_stored_in(database: 'db2') }
157
+ end
158
+ ```
159
+
160
+ It works fine with lambdas and procs.
161
+
162
+ ```ruby
163
+ class User
164
+ include Mongoid::Document
165
+
166
+ store_in database: ->{ Thread.current[:database] }
167
+ end
168
+
169
+ RSpec.describe Post, type: :model do
170
+ it do
171
+ Thread.current[:database] = 'db3'
172
+ is_expected.to be_stored_in(database: 'db3')
173
+
174
+ Thread.current[:database] = 'db4'
175
+ is_expected.to be_stored_in(database: 'db4')
176
+ end
177
+ end
178
+ ```
179
+
180
+ ### have_index_for
181
+
182
+ ```ruby
183
+ class Article
184
+ index({ title: 1 }, { unique: true, background: true, drop_dups: true })
185
+ index({ title: 1, created_at: -1 })
186
+ index({ category: 1 })
187
+ end
188
+
189
+ RSpec.describe Article, type: :model do
190
+ it do
191
+ is_expected
192
+ .to have_index_for(title: 1)
193
+ .with_options(unique: true, background: true, drop_dups: true)
194
+ end
195
+ it { is_expected.to have_index_for(title: 1, created_at: -1) }
196
+ it { is_expected.to have_index_for(category: 1) }
197
+ end
198
+ ```
199
+
200
+ ### Field Matchers
201
+
202
+ ```ruby
203
+ RSpec.describe Article do
204
+ it { is_expected.to have_field(:published).of_type(Boolean).with_default_value_of(false) }
205
+ it { is_expected.to have_field(:allow_comments).of_type(Boolean).with_default_value_of(true) }
206
+ it { is_expected.not_to have_field(:allow_comments).of_type(Boolean).with_default_value_of(false) }
207
+ it { is_expected.not_to have_field(:number_of_comments).of_type(Integer).with_default_value_of(1) }
208
+ end
209
+
210
+ RSpec.describe User do
211
+ it { is_expected.to have_fields(:email, :login) }
212
+ it { is_expected.to have_field(:s).with_alias(:status) }
213
+ it { is_expected.to have_fields(:birthdate, :registered_at).of_type(DateTime) }
214
+ end
215
+ ```
216
+
45
217
  ### Association Matchers
46
218
 
47
219
  ```ruby
@@ -49,14 +221,16 @@ RSpec.describe User do
49
221
  it { is_expected.to have_many(:articles).with_foreign_key(:author_id).ordered_by(:title) }
50
222
 
51
223
  it { is_expected.to have_one(:record) }
52
- #can verify autobuild is set to true
224
+
225
+ # can verify autobuild is set to true
53
226
  it { is_expected.to have_one(:record).with_autobuild }
54
227
 
55
228
  it { is_expected.to have_many :comments }
56
229
 
57
- #can also specify with_dependent to test if :dependent => :destroy/:destroy_all/:delete is set
230
+ # can also specify with_dependent to test if :dependent => :destroy/:destroy_all/:delete is set
58
231
  it { is_expected.to have_many(:comments).with_dependent(:destroy) }
59
- #can verify autosave is set to true
232
+
233
+ # can verify autosave is set to true
60
234
  it { is_expected.to have_many(:comments).with_autosave }
61
235
 
62
236
  it { is_expected.to embed_one :profile }
@@ -87,20 +261,9 @@ end
87
261
  RSpec.describe Site do
88
262
  it { is_expected.to have_many(:users).as_inverse_of(:site).ordered_by(:email.asc).with_counter_cache }
89
263
  end
90
- ```
91
-
92
- ### Mass Assignment Matcher
93
-
94
- ```ruby
95
- RSpec.describe User do
96
- it { is_expected.to allow_mass_assignment_of(:login) }
97
- it { is_expected.to allow_mass_assignment_of(:email) }
98
- it { is_expected.to allow_mass_assignment_of(:age) }
99
- it { is_expected.to allow_mass_assignment_of(:password) }
100
- it { is_expected.to allow_mass_assignment_of(:password) }
101
- it { is_expected.to allow_mass_assignment_of(:role).as(:admin) }
102
264
 
103
- it { is_expected.not_to allow_mass_assignment_of(:role) }
265
+ RSpec.describe Message do
266
+ it { is_expected.to belong_to(:user).with_optional }
104
267
  end
105
268
  ```
106
269
 
@@ -131,6 +294,11 @@ end
131
294
 
132
295
  RSpec.describe Article do
133
296
  it { is_expected.to validate_length_of(:title).within(8..16) }
297
+ it { is_expected.to validate_absence_of(:deletion_date) }
298
+ end
299
+
300
+ RSpec.describe Visitor do
301
+ it { is_expected.to validate_length_of(:name).with_maximum(160).with_minimum(1) }
134
302
  end
135
303
 
136
304
  RSpec.describe Profile do
@@ -149,88 +317,40 @@ RSpec.describe Person do
149
317
  end
150
318
  ```
151
319
 
152
- ### Accepts Nested Attributes Matcher
320
+ ### Mass Assignment Matcher
153
321
 
154
322
  ```ruby
155
323
  RSpec.describe User do
156
- it { is_expected.to accept_nested_attributes_for(:articles) }
157
- it { is_expected.to accept_nested_attributes_for(:comments) }
158
- end
159
-
160
- RSpec.describe Article do
161
- it { is_expected.to accept_nested_attributes_for(:permalink) }
162
- end
163
- ```
164
-
165
- ### Index Matcher
166
-
167
- ```ruby
168
- RSpec.describe Article do
169
- it { is_expected.to have_index_for(published: 1) }
170
- it { is_expected.to have_index_for(title: 1).with_options(unique: true, background: true) }
171
- end
172
-
173
- RSpec.describe Profile do
174
- it { is_expected.to have_index_for(first_name: 1, last_name: 1) }
175
- end
324
+ it { is_expected.to allow_mass_assignment_of(:login) }
325
+ it { is_expected.to allow_mass_assignment_of(:email) }
326
+ it { is_expected.to allow_mass_assignment_of(:age) }
327
+ it { is_expected.to allow_mass_assignment_of(:password) }
328
+ it { is_expected.to allow_mass_assignment_of(:password) }
329
+ it { is_expected.to allow_mass_assignment_of(:role).as(:admin) }
176
330
 
177
- Rspec.describe Log do
178
- it { is_expected.to have_index_for(created_at: 1).with_options(bucket_size: 100, expire_after_seconds: 3600) }
331
+ it { is_expected.not_to allow_mass_assignment_of(:role) }
179
332
  end
180
333
  ```
181
334
 
182
- ### Others
335
+ ### Accepts Nested Attributes Matcher
183
336
 
184
337
  ```ruby
185
338
  RSpec.describe User do
186
- it { is_expected.to have_fields(:email, :login) }
187
- it { is_expected.to have_field(:s).with_alias(:status) }
188
- it { is_expected.to have_fields(:birthdate, :registered_at).of_type(DateTime) }
189
-
190
- # if you're declaring 'include Mongoid::Timestamps'
191
- # or any of 'include Mongoid::Timestamps::Created' and 'Mongoid::Timestamps::Updated'
192
- it { is_expected.to be_timestamped_document }
193
- it { is_expected.to be_timestamped_document.with(:created) }
194
- it { is_expected.not_to be_timestamped_document.with(:updated) }
195
-
196
- it { is_expected.to be_versioned_document } # if you're declaring `include Mongoid::Versioning`
197
- it { is_expected.to be_paranoid_document } # if you're declaring `include Mongoid::Paranoia`
198
- it { is_expected.to be_multiparameted_document } # if you're declaring `include Mongoid::MultiParameterAttributes`
199
- end
200
-
201
- RSpec.describe Log do
202
- it { is_expected.to be_stored_in :logs }
203
- it { is_expected.to be_dynamic_document }
339
+ it { is_expected.to accept_nested_attributes_for(:articles) }
340
+ it { is_expected.to accept_nested_attributes_for(:comments) }
204
341
  end
205
342
 
206
343
  RSpec.describe Article do
207
- it { is_expected.to have_field(:published).of_type(Boolean).with_default_value_of(false) }
208
- it { is_expected.to have_field(:allow_comments).of_type(Boolean).with_default_value_of(true) }
209
- it { is_expected.not_to have_field(:allow_comments).of_type(Boolean).with_default_value_of(false) }
210
- it { is_expected.not_to have_field(:number_of_comments).of_type(Integer).with_default_value_of(1) }
344
+ it { is_expected.to accept_nested_attributes_for(:permalink) }
211
345
  end
212
346
  ```
213
347
 
214
- ## Known issues
215
-
216
- accept_nested_attributes_for matcher must test options [issue 91](https://github.com/mongoid-rspec/mongoid-rspec/issues/91).
217
-
218
- ## Acknowledgement
219
-
220
- Thanks to [Durran Jordan][durran] for providing the changes necessary to make
221
- this compatible with mongoid 2.0.0.rc, and for other [contributors](https://github.com/mongoid-rspec/mongoid-rspec/contributors)
222
- to this project.
348
+ ## Contributing
223
349
 
224
- [durran]: https://github.com/durran
225
- [mongoid2]: http://rubygems.org/gems/mongoid-rspec/versions/1.4.5
226
- [mongoid3]: http://rubygems.org/gems/mongoid-rspec/versions/1.13.0
227
- [mongoid4]: http://rubygems.org/gems/mongoid-rspec/versions/2.0.0
350
+ You're encouraged to contribute to this library. See [CONTRIBUTING](CONTRIBUTING.md) for details.
228
351
 
229
- [travis_badge]: http://img.shields.io/travis/mongoid-rspec/mongoid-rspec.svg?style=flat
230
- [travis]: https://travis-ci.org/mongoid-rspec/mongoid-rspec
352
+ ## Copyright and License
231
353
 
232
- [rubygems_badge]: http://img.shields.io/gem/v/mongoid-rspec.svg?style=flat
233
- [rubygems]: http://rubygems.org/gems/mongoid-rspec
354
+ Copyright (c) 2009-2018 Evan Sagge and Contributors.
234
355
 
235
- [codeclimate_badge]: http://img.shields.io/codeclimate/github/mongoid-rspec/mongoid-rspec.svg?style=flat
236
- [codeclimate]: https://codeclimate.com/github/mongoid-rspec/mongoid-rspec
356
+ MIT License. See [LICENSE](LICENSE) for details.
data/Rakefile CHANGED
@@ -1,17 +1,20 @@
1
- $:.push File.expand_path("../lib", __FILE__)
1
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
2
2
 
3
3
  require 'bundler'
4
4
  Bundler::GemHelper.install_tasks
5
5
 
6
6
  require 'rspec/core/rake_task'
7
7
 
8
- task :default => :spec
9
-
10
8
  RSpec::Core::RakeTask.new(:spec) do |spec|
11
- spec.pattern = "./spec/**/*_spec.rb"
9
+ spec.pattern = './spec/**/*_spec.rb'
12
10
  end
13
11
 
14
12
  RSpec::Core::RakeTask.new(:rcov) do |spec|
15
- spec.pattern = "./spec/**/*_spec.rb"
13
+ spec.pattern = './spec/**/*_spec.rb'
16
14
  spec.rcov = true
17
15
  end
16
+
17
+ require 'rubocop/rake_task'
18
+ RuboCop::RakeTask.new(:rubocop)
19
+
20
+ task default: %i[rubocop spec]
@@ -1,6 +1,5 @@
1
1
  module Mongoid
2
2
  module Matchers # :nodoc:
3
-
4
3
  # Ensures that the model can accept nested attributes for the specified
5
4
  # association.
6
5
  #
@@ -12,7 +11,6 @@ module Mongoid
12
11
  end
13
12
 
14
13
  class AcceptNestedAttributesForMatcher
15
-
16
14
  def initialize(attribute)
17
15
  @attribute = attribute.to_s
18
16
  @options = {}
@@ -31,37 +29,38 @@ module Mongoid
31
29
  "Did not expect #{expectation}"
32
30
  end
33
31
 
34
- alias :failure_message_when_negated :negative_failure_message
32
+ alias failure_message_when_negated negative_failure_message
35
33
 
36
34
  def description
37
35
  description = "accepts_nested_attributes_for :#{@attribute}"
38
36
  end
39
37
 
40
38
  protected
41
- def match?
42
- exists?
43
- end
44
39
 
45
- def exists?
46
- if config
47
- true
48
- else
49
- @problem = 'is not declared'
50
- false
51
- end
52
- end
40
+ def match?
41
+ exists?
42
+ end
53
43
 
54
- def config
55
- model_class.nested_attributes["#{@attribute}_attributes"]
44
+ def exists?
45
+ if config
46
+ true
47
+ else
48
+ @problem = 'is not declared'
49
+ false
56
50
  end
51
+ end
57
52
 
58
- def model_class
59
- @subject.class
60
- end
53
+ def config
54
+ model_class.nested_attributes["#{@attribute}_attributes"]
55
+ end
61
56
 
62
- def expectation
63
- "#{model_class.name} to accept nested attributes for #{@attribute}"
64
- end
57
+ def model_class
58
+ @subject.class
59
+ end
60
+
61
+ def expectation
62
+ "#{model_class.name} to accept nested attributes for #{@attribute}"
63
+ end
65
64
  end
66
65
  end
67
- end
66
+ end