rspec-expectations 3.0.0.beta1 → 3.0.0.beta2
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.
- data.tar.gz.sig +2 -2
- data/.yardopts +1 -0
- data/Changelog.md +138 -0
- data/README.md +75 -8
- data/features/README.md +2 -2
- data/features/built_in_matchers/README.md +12 -9
- data/features/built_in_matchers/comparisons.feature +2 -2
- data/features/built_in_matchers/contain_exactly.feature +46 -0
- data/features/built_in_matchers/expect_change.feature +2 -2
- data/features/built_in_matchers/include.feature +0 -48
- data/features/built_in_matchers/output.feature +70 -0
- data/features/composing_matchers.feature +250 -0
- data/features/compound_expectations.feature +45 -0
- data/features/custom_matchers/access_running_example.feature +1 -1
- data/features/custom_matchers/define_matcher.feature +6 -6
- data/features/custom_matchers/define_matcher_outside_rspec.feature +4 -8
- data/features/test_frameworks/{test_unit.feature → minitest.feature} +11 -11
- data/lib/rspec/expectations.rb +31 -42
- data/lib/rspec/expectations/diff_presenter.rb +141 -0
- data/lib/rspec/expectations/differ.rb +22 -132
- data/lib/rspec/expectations/encoded_string.rb +56 -0
- data/lib/rspec/expectations/expectation_target.rb +0 -30
- data/lib/rspec/expectations/fail_with.rb +2 -2
- data/lib/rspec/expectations/handler.rb +128 -31
- data/lib/rspec/expectations/minitest_integration.rb +16 -0
- data/lib/rspec/expectations/syntax.rb +4 -58
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers.rb +298 -60
- data/lib/rspec/matchers/aliased_matcher.rb +35 -0
- data/lib/rspec/matchers/built_in.rb +37 -33
- data/lib/rspec/matchers/built_in/base_matcher.rb +25 -15
- data/lib/rspec/matchers/built_in/be.rb +23 -31
- data/lib/rspec/matchers/built_in/be_between.rb +55 -0
- data/lib/rspec/matchers/built_in/be_within.rb +15 -11
- data/lib/rspec/matchers/built_in/change.rb +198 -81
- data/lib/rspec/matchers/built_in/compound.rb +106 -0
- data/lib/rspec/matchers/built_in/contain_exactly.rb +245 -0
- data/lib/rspec/matchers/built_in/eq.rb +43 -4
- data/lib/rspec/matchers/built_in/eql.rb +2 -2
- data/lib/rspec/matchers/built_in/equal.rb +35 -18
- data/lib/rspec/matchers/built_in/has.rb +16 -15
- data/lib/rspec/matchers/built_in/include.rb +45 -23
- data/lib/rspec/matchers/built_in/match.rb +6 -3
- data/lib/rspec/matchers/built_in/operators.rb +103 -0
- data/lib/rspec/matchers/built_in/output.rb +108 -0
- data/lib/rspec/matchers/built_in/raise_error.rb +9 -15
- data/lib/rspec/matchers/built_in/respond_to.rb +5 -4
- data/lib/rspec/matchers/built_in/satisfy.rb +4 -3
- data/lib/rspec/matchers/built_in/start_and_end_with.rb +37 -16
- data/lib/rspec/matchers/built_in/throw_symbol.rb +6 -5
- data/lib/rspec/matchers/built_in/yield.rb +31 -29
- data/lib/rspec/matchers/composable.rb +138 -0
- data/lib/rspec/matchers/dsl.rb +330 -0
- data/lib/rspec/matchers/generated_descriptions.rb +6 -6
- data/lib/rspec/matchers/matcher_delegator.rb +33 -0
- data/lib/rspec/matchers/pretty.rb +13 -2
- data/spec/rspec/expectations/{differ_spec.rb → diff_presenter_spec.rb} +56 -36
- data/spec/rspec/expectations/encoded_string_spec.rb +74 -0
- data/spec/rspec/expectations/extensions/kernel_spec.rb +11 -11
- data/spec/rspec/expectations/fail_with_spec.rb +8 -8
- data/spec/rspec/expectations/handler_spec.rb +27 -49
- data/spec/rspec/expectations/minitest_integration_spec.rb +27 -0
- data/spec/rspec/expectations/syntax_spec.rb +17 -67
- data/spec/rspec/expectations_spec.rb +7 -52
- data/spec/rspec/matchers/aliased_matcher_spec.rb +48 -0
- data/spec/rspec/matchers/aliases_spec.rb +449 -0
- data/spec/rspec/matchers/{base_matcher_spec.rb → built_in/base_matcher_spec.rb} +24 -3
- data/spec/rspec/matchers/built_in/be_between_spec.rb +159 -0
- data/spec/rspec/matchers/{be_instance_of_spec.rb → built_in/be_instance_of_spec.rb} +0 -0
- data/spec/rspec/matchers/{be_kind_of_spec.rb → built_in/be_kind_of_spec.rb} +0 -0
- data/spec/rspec/matchers/{be_spec.rb → built_in/be_spec.rb} +76 -32
- data/spec/rspec/matchers/{be_within_spec.rb → built_in/be_within_spec.rb} +6 -2
- data/spec/rspec/matchers/{change_spec.rb → built_in/change_spec.rb} +310 -69
- data/spec/rspec/matchers/built_in/compound_spec.rb +292 -0
- data/spec/rspec/matchers/built_in/contain_exactly_spec.rb +441 -0
- data/spec/rspec/matchers/{cover_spec.rb → built_in/cover_spec.rb} +0 -0
- data/spec/rspec/matchers/built_in/eq_spec.rb +156 -0
- data/spec/rspec/matchers/{eql_spec.rb → built_in/eql_spec.rb} +2 -2
- data/spec/rspec/matchers/built_in/equal_spec.rb +106 -0
- data/spec/rspec/matchers/{exist_spec.rb → built_in/exist_spec.rb} +1 -1
- data/spec/rspec/matchers/{has_spec.rb → built_in/has_spec.rb} +39 -0
- data/spec/rspec/matchers/{include_spec.rb → built_in/include_spec.rb} +118 -109
- data/spec/rspec/matchers/{match_spec.rb → built_in/match_spec.rb} +30 -2
- data/spec/rspec/matchers/{operator_matcher_spec.rb → built_in/operators_spec.rb} +26 -26
- data/spec/rspec/matchers/built_in/output_spec.rb +165 -0
- data/spec/rspec/matchers/{raise_error_spec.rb → built_in/raise_error_spec.rb} +81 -11
- data/spec/rspec/matchers/{respond_to_spec.rb → built_in/respond_to_spec.rb} +0 -0
- data/spec/rspec/matchers/{satisfy_spec.rb → built_in/satisfy_spec.rb} +0 -0
- data/spec/rspec/matchers/{start_with_end_with_spec.rb → built_in/start_and_end_with_spec.rb} +82 -15
- data/spec/rspec/matchers/{throw_symbol_spec.rb → built_in/throw_symbol_spec.rb} +29 -10
- data/spec/rspec/matchers/{yield_spec.rb → built_in/yield_spec.rb} +90 -0
- data/spec/rspec/matchers/configuration_spec.rb +7 -39
- data/spec/rspec/matchers/description_generation_spec.rb +22 -6
- data/spec/rspec/matchers/dsl_spec.rb +838 -0
- data/spec/rspec/matchers/legacy_spec.rb +101 -0
- data/spec/rspec/matchers_spec.rb +74 -0
- data/spec/spec_helper.rb +35 -21
- data/spec/support/shared_examples.rb +26 -4
- metadata +172 -116
- metadata.gz.sig +3 -4
- checksums.yaml +0 -15
- checksums.yaml.gz.sig +0 -0
- data/features/built_in_matchers/match_array.feature +0 -37
- data/lib/rspec/expectations/errors.rb +0 -9
- data/lib/rspec/expectations/extensions.rb +0 -1
- data/lib/rspec/expectations/extensions/object.rb +0 -29
- data/lib/rspec/matchers/built_in/match_array.rb +0 -51
- data/lib/rspec/matchers/compatibility.rb +0 -14
- data/lib/rspec/matchers/matcher.rb +0 -301
- data/lib/rspec/matchers/method_missing.rb +0 -12
- data/lib/rspec/matchers/operator_matcher.rb +0 -99
- data/lib/rspec/matchers/test_unit_integration.rb +0 -11
- data/spec/rspec/matchers/eq_spec.rb +0 -60
- data/spec/rspec/matchers/equal_spec.rb +0 -78
- data/spec/rspec/matchers/include_matcher_integration_spec.rb +0 -30
- data/spec/rspec/matchers/match_array_spec.rb +0 -194
- data/spec/rspec/matchers/matcher_spec.rb +0 -706
- data/spec/rspec/matchers/matchers_spec.rb +0 -36
- data/spec/rspec/matchers/method_missing_spec.rb +0 -28
- data/spec/support/classes.rb +0 -56
- data/spec/support/in_sub_process.rb +0 -37
- data/spec/support/ruby_version.rb +0 -10
@@ -20,7 +20,7 @@ describe "expect { ... }.to change(actual, message)" do
|
|
20
20
|
it "fails when actual is not modified by the block" do
|
21
21
|
expect do
|
22
22
|
expect {}.to change(@instance, :some_value)
|
23
|
-
end.to fail_with("some_value
|
23
|
+
end.to fail_with("expected #some_value to have changed, but is still 5")
|
24
24
|
end
|
25
25
|
|
26
26
|
it "provides a #description" do
|
@@ -55,7 +55,7 @@ describe "expect { ... }.to change(actual, message)" do
|
|
55
55
|
it "fails when actual is not modified by the block" do
|
56
56
|
expect do
|
57
57
|
expect {}.to change(@instance, :some_value)
|
58
|
-
end.to fail_with("some_value
|
58
|
+
end.to fail_with("expected #some_value to have changed, but is still true")
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -72,7 +72,7 @@ describe "expect { ... }.to change(actual, message)" do
|
|
72
72
|
it "fails when actual is not modified by the block" do
|
73
73
|
expect do
|
74
74
|
expect {}.to change(@instance, :some_value)
|
75
|
-
end.to fail_with("some_value
|
75
|
+
end.to fail_with("expected #some_value to have changed, but is still nil")
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
@@ -89,7 +89,7 @@ describe "expect { ... }.to change(actual, message)" do
|
|
89
89
|
it "fails when a predicate on the actual fails" do
|
90
90
|
expect do
|
91
91
|
expect {@instance.some_value << 1}.to change { @instance.some_value }.to be_empty
|
92
|
-
end.to fail_with(/result
|
92
|
+
end.to fail_with(/result to have changed to/)
|
93
93
|
end
|
94
94
|
|
95
95
|
it "passes when a predicate on the actual passes" do
|
@@ -100,7 +100,7 @@ describe "expect { ... }.to change(actual, message)" do
|
|
100
100
|
it "fails when actual is not modified by the block" do
|
101
101
|
expect do
|
102
102
|
expect {}.to change(@instance, :some_value)
|
103
|
-
end.to fail_with("some_value
|
103
|
+
end.to fail_with("expected #some_value to have changed, but is still []")
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
@@ -131,7 +131,7 @@ describe "expect { ... }.to change(actual, message)" do
|
|
131
131
|
string = "ab"
|
132
132
|
expect {
|
133
133
|
expect { }.to change { string }
|
134
|
-
}.to fail_with(/
|
134
|
+
}.to fail_with(/to have changed/)
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
@@ -168,7 +168,7 @@ describe "expect { ... }.to change(actual, message)" do
|
|
168
168
|
it "fails when actual is not modified by the block" do
|
169
169
|
expect do
|
170
170
|
expect {}.to change(@instance, :some_value)
|
171
|
-
end.to fail_with(/^some_value
|
171
|
+
end.to fail_with(/^expected #some_value to have changed, but is still/)
|
172
172
|
end
|
173
173
|
|
174
174
|
end
|
@@ -187,16 +187,11 @@ describe "expect { ... }.not_to change(actual, message)" do
|
|
187
187
|
it "fails when actual is not modified by the block" do
|
188
188
|
expect do
|
189
189
|
expect {@instance.some_value = 6}.not_to change(@instance, :some_value)
|
190
|
-
end.to fail_with("some_value
|
190
|
+
end.to fail_with("expected #some_value not to have changed, but did change from 5 to 6")
|
191
191
|
end
|
192
192
|
end
|
193
193
|
|
194
194
|
describe "expect { ... }.to change { block }" do
|
195
|
-
o = SomethingExpected.new
|
196
|
-
it_behaves_like "an RSpec matcher", :valid_value => lambda { o.some_value = 5 },
|
197
|
-
:invalid_value => lambda { } do
|
198
|
-
let(:matcher) { change { o.some_value } }
|
199
|
-
end
|
200
195
|
|
201
196
|
before(:each) do
|
202
197
|
@instance = SomethingExpected.new
|
@@ -210,17 +205,17 @@ describe "expect { ... }.to change { block }" do
|
|
210
205
|
it "fails when actual is not modified by the block" do
|
211
206
|
expect do
|
212
207
|
expect {}.to change{ @instance.some_value }
|
213
|
-
end.to fail_with("result
|
208
|
+
end.to fail_with("expected result to have changed, but is still 5")
|
214
209
|
end
|
215
210
|
|
216
211
|
it "warns if passed a block using do/end instead of {}" do
|
217
212
|
expect do
|
218
213
|
expect {}.to change do; end
|
219
|
-
end.to raise_error(SyntaxError, /block passed to
|
214
|
+
end.to raise_error(SyntaxError, /block passed to the `change` matcher/)
|
220
215
|
end
|
221
216
|
|
222
217
|
it "provides a #description" do
|
223
|
-
expect(change { @instance.some_value }.description).to eq "change
|
218
|
+
expect(change { @instance.some_value }.description).to eq "change result"
|
224
219
|
end
|
225
220
|
end
|
226
221
|
|
@@ -237,13 +232,84 @@ describe "expect { ... }.not_to change { block }" do
|
|
237
232
|
it "fails when actual is not modified by the block" do
|
238
233
|
expect do
|
239
234
|
expect {@instance.some_value = 6}.not_to change { @instance.some_value }
|
240
|
-
end.to fail_with("result
|
235
|
+
end.to fail_with("expected result not to have changed, but did change from 5 to 6")
|
241
236
|
end
|
242
237
|
|
243
238
|
it "warns if passed a block using do/end instead of {}" do
|
244
239
|
expect do
|
245
240
|
expect {}.not_to change do; end
|
246
|
-
end.to raise_error(SyntaxError, /block passed to
|
241
|
+
end.to raise_error(SyntaxError, /block passed to the `change` matcher/)
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
|
246
|
+
describe "expect { ... }.not_to change { }.from" do
|
247
|
+
context 'when the value starts at the from value' do
|
248
|
+
it 'passes when the value does not change' do
|
249
|
+
k = 5
|
250
|
+
expect { }.not_to change { k }.from(5)
|
251
|
+
end
|
252
|
+
|
253
|
+
it 'fails when the value does change' do
|
254
|
+
expect {
|
255
|
+
k = 5
|
256
|
+
expect { k += 1 }.not_to change { k }.from(5)
|
257
|
+
}.to fail_with(/but did change from 5 to 6/)
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
context 'when the value starts at a different value' do
|
262
|
+
it 'fails when the value does not change' do
|
263
|
+
expect {
|
264
|
+
k = 6
|
265
|
+
expect { }.not_to change { k }.from(5)
|
266
|
+
}.to fail_with(/expected result to have initially been 5/)
|
267
|
+
end
|
268
|
+
|
269
|
+
it 'fails when the value does change' do
|
270
|
+
expect {
|
271
|
+
k = 6
|
272
|
+
expect { k += 1 }.not_to change { k }.from(5)
|
273
|
+
}.to fail_with(/expected result to have initially been 5/)
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
277
|
+
|
278
|
+
describe "expect { ... }.not_to change { }.to" do
|
279
|
+
it 'is not supported' do
|
280
|
+
expect {
|
281
|
+
expect { }.not_to change { }.to(3)
|
282
|
+
}.to raise_error(NotImplementedError)
|
283
|
+
end
|
284
|
+
|
285
|
+
it 'is not supported when it comes after `from`' do
|
286
|
+
expect {
|
287
|
+
expect { }.not_to change { }.from(nil).to(3)
|
288
|
+
}.to raise_error(NotImplementedError)
|
289
|
+
end
|
290
|
+
end
|
291
|
+
|
292
|
+
describe "expect { ... }.not_to change { }.by" do
|
293
|
+
it 'is not supported' do
|
294
|
+
expect {
|
295
|
+
expect { }.not_to change { }.by(3)
|
296
|
+
}.to raise_error(NotImplementedError)
|
297
|
+
end
|
298
|
+
end
|
299
|
+
|
300
|
+
describe "expect { ... }.not_to change { }.by_at_least" do
|
301
|
+
it 'is not supported' do
|
302
|
+
expect {
|
303
|
+
expect { }.not_to change { }.by_at_least(3)
|
304
|
+
}.to raise_error(NotImplementedError)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
describe "expect { ... }.not_to change { }.by_at_most" do
|
309
|
+
it 'is not supported' do
|
310
|
+
expect {
|
311
|
+
expect { }.not_to change { }.by_at_most(3)
|
312
|
+
}.to raise_error(NotImplementedError)
|
247
313
|
end
|
248
314
|
end
|
249
315
|
|
@@ -264,13 +330,17 @@ describe "expect { ... }.to change(actual, message).by(expected)" do
|
|
264
330
|
it "fails when the attribute is changed by unexpected amount" do
|
265
331
|
expect do
|
266
332
|
expect { @instance.some_value += 2 }.to change(@instance, :some_value).by(1)
|
267
|
-
end.to fail_with("some_value
|
333
|
+
end.to fail_with("expected #some_value to have changed by 1, but was changed by 2")
|
268
334
|
end
|
269
335
|
|
270
336
|
it "fails when the attribute is changed by unexpected amount in the opposite direction" do
|
271
337
|
expect do
|
272
338
|
expect { @instance.some_value -= 1 }.to change(@instance, :some_value).by(1)
|
273
|
-
end.to fail_with("some_value
|
339
|
+
end.to fail_with("expected #some_value to have changed by 1, but was changed by -1")
|
340
|
+
end
|
341
|
+
|
342
|
+
it "provides a #description" do
|
343
|
+
expect(change(@instance, :some_value).by(3).description).to eq "change #some_value by 3"
|
274
344
|
end
|
275
345
|
end
|
276
346
|
|
@@ -287,13 +357,17 @@ describe "expect { ... }.to change { block }.by(expected)" do
|
|
287
357
|
it "fails when the attribute is changed by unexpected amount" do
|
288
358
|
expect do
|
289
359
|
expect { @instance.some_value += 2 }.to change{@instance.some_value}.by(1)
|
290
|
-
end.to fail_with("result
|
360
|
+
end.to fail_with("expected result to have changed by 1, but was changed by 2")
|
291
361
|
end
|
292
362
|
|
293
363
|
it "fails when the attribute is changed by unexpected amount in the opposite direction" do
|
294
364
|
expect do
|
295
365
|
expect { @instance.some_value -= 1 }.to change{@instance.some_value}.by(1)
|
296
|
-
end.to fail_with("result
|
366
|
+
end.to fail_with("expected result to have changed by 1, but was changed by -1")
|
367
|
+
end
|
368
|
+
|
369
|
+
it "provides a #description" do
|
370
|
+
expect(change { @instance.some_value }.by(3).description).to eq "change result by 3"
|
297
371
|
end
|
298
372
|
end
|
299
373
|
|
@@ -314,9 +388,12 @@ describe "expect { ... }.to change(actual, message).by_at_least(expected)" do
|
|
314
388
|
it "fails when the attribute is changed by less than the expected amount" do
|
315
389
|
expect do
|
316
390
|
expect { @instance.some_value += 1 }.to change(@instance, :some_value).by_at_least(2)
|
317
|
-
end.to fail_with("some_value
|
391
|
+
end.to fail_with("expected #some_value to have changed by at least 2, but was changed by 1")
|
318
392
|
end
|
319
393
|
|
394
|
+
it "provides a #description" do
|
395
|
+
expect(change(@instance, :some_value).by_at_least(3).description).to eq "change #some_value by at least 3"
|
396
|
+
end
|
320
397
|
end
|
321
398
|
|
322
399
|
describe "expect { ... }.to change { block }.by_at_least(expected)" do
|
@@ -336,7 +413,11 @@ describe "expect { ... }.to change { block }.by_at_least(expected)" do
|
|
336
413
|
it "fails when the attribute is changed by less than the unexpected amount" do
|
337
414
|
expect do
|
338
415
|
expect { @instance.some_value += 1 }.to change{@instance.some_value}.by_at_least(2)
|
339
|
-
end.to fail_with("result
|
416
|
+
end.to fail_with("expected result to have changed by at least 2, but was changed by 1")
|
417
|
+
end
|
418
|
+
|
419
|
+
it "provides a #description" do
|
420
|
+
expect(change { @instance.some_value }.by_at_least(3).description).to eq "change result by at least 3"
|
340
421
|
end
|
341
422
|
end
|
342
423
|
|
@@ -358,9 +439,12 @@ describe "expect { ... }.to change(actual, message).by_at_most(expected)" do
|
|
358
439
|
it "fails when the attribute is changed by greater than the expected amount" do
|
359
440
|
expect do
|
360
441
|
expect { @instance.some_value += 2 }.to change(@instance, :some_value).by_at_most(1)
|
361
|
-
end.to fail_with("some_value
|
442
|
+
end.to fail_with("expected #some_value to have changed by at most 1, but was changed by 2")
|
362
443
|
end
|
363
444
|
|
445
|
+
it "provides a #description" do
|
446
|
+
expect(change(@instance, :some_value).by_at_most(3).description).to eq "change #some_value by at most 3"
|
447
|
+
end
|
364
448
|
end
|
365
449
|
|
366
450
|
describe "expect { ... }.to change { block }.by_at_most(expected)" do
|
@@ -380,7 +464,11 @@ describe "expect { ... }.to change { block }.by_at_most(expected)" do
|
|
380
464
|
it "fails when the attribute is changed by greater than the unexpected amount" do
|
381
465
|
expect do
|
382
466
|
expect { @instance.some_value += 2 }.to change{@instance.some_value}.by_at_most(1)
|
383
|
-
end.to fail_with("result
|
467
|
+
end.to fail_with("expected result to have changed by at most 1, but was changed by 2")
|
468
|
+
end
|
469
|
+
|
470
|
+
it "provides a #description" do
|
471
|
+
expect(change { @instance.some_value }.by_at_most(3).description).to eq "change result by at most 3"
|
384
472
|
end
|
385
473
|
end
|
386
474
|
|
@@ -398,7 +486,7 @@ describe "expect { ... }.to change(actual, message).from(old)" do
|
|
398
486
|
it "fails when attribute is not == to expected value before executing block" do
|
399
487
|
expect do
|
400
488
|
expect { @instance.some_value = 'foo' }.to change(@instance, :some_value).from(false)
|
401
|
-
end.to fail_with("some_value
|
489
|
+
end.to fail_with("expected #some_value to have initially been false, but was true")
|
402
490
|
end
|
403
491
|
end
|
404
492
|
context "with non-boolean values" do
|
@@ -407,20 +495,18 @@ describe "expect { ... }.to change(actual, message).from(old)" do
|
|
407
495
|
@instance.some_value = 'string'
|
408
496
|
end
|
409
497
|
|
410
|
-
it "passes when attribute
|
498
|
+
it "passes when attribute matches expected value before executing block" do
|
411
499
|
expect { @instance.some_value = "astring" }.to change(@instance, :some_value).from("string")
|
412
500
|
end
|
413
501
|
|
414
|
-
it "
|
415
|
-
expected = "string"
|
416
|
-
expected.should_receive(:===).and_return true
|
417
|
-
expect { @instance.some_value = "astring" }.to change(@instance, :some_value).from(expected)
|
418
|
-
end
|
419
|
-
|
420
|
-
it "fails when attribute is not === to expected value before executing block" do
|
502
|
+
it "fails when attribute does not match expected value before executing block" do
|
421
503
|
expect do
|
422
504
|
expect { @instance.some_value = "knot" }.to change(@instance, :some_value).from("cat")
|
423
|
-
end.to fail_with("some_value
|
505
|
+
end.to fail_with("expected #some_value to have initially been \"cat\", but was \"string\"")
|
506
|
+
end
|
507
|
+
|
508
|
+
it "provides a #description" do
|
509
|
+
expect(change(@instance, :some_value).from(3).description).to eq "change #some_value from 3"
|
424
510
|
end
|
425
511
|
end
|
426
512
|
end
|
@@ -431,20 +517,24 @@ describe "expect { ... }.to change { block }.from(old)" do
|
|
431
517
|
@instance.some_value = 'string'
|
432
518
|
end
|
433
519
|
|
434
|
-
it "passes when attribute
|
520
|
+
it "passes when attribute matches expected value before executing block" do
|
435
521
|
expect { @instance.some_value = "astring" }.to change{@instance.some_value}.from("string")
|
436
522
|
end
|
437
523
|
|
438
|
-
it "
|
439
|
-
|
440
|
-
|
441
|
-
|
524
|
+
it "fails when attribute does not match expected value before executing block" do
|
525
|
+
expect do
|
526
|
+
expect { @instance.some_value = "knot" }.to change{@instance.some_value}.from("cat")
|
527
|
+
end.to fail_with("expected result to have initially been \"cat\", but was \"string\"")
|
442
528
|
end
|
443
529
|
|
444
|
-
it "fails when attribute
|
530
|
+
it "fails when attribute does not change" do
|
445
531
|
expect do
|
446
|
-
expect {
|
447
|
-
end.to fail_with(
|
532
|
+
expect { }.to change { @instance.some_value }.from("string")
|
533
|
+
end.to fail_with('expected result to have changed from "string", but did not change')
|
534
|
+
end
|
535
|
+
|
536
|
+
it "provides a #description" do
|
537
|
+
expect(change { }.from(3).description).to eq "change result from 3"
|
448
538
|
end
|
449
539
|
end
|
450
540
|
|
@@ -462,29 +552,30 @@ describe "expect { ... }.to change(actual, message).to(new)" do
|
|
462
552
|
it "fails when attribute is not == to expected value after executing block" do
|
463
553
|
expect do
|
464
554
|
expect { @instance.some_value = 1 }.to change(@instance, :some_value).from(true).to(false)
|
465
|
-
end.to fail_with("some_value
|
555
|
+
end.to fail_with("expected #some_value to have changed to false, but is now 1")
|
466
556
|
end
|
467
557
|
end
|
558
|
+
|
468
559
|
context "with non-boolean values" do
|
469
560
|
before(:each) do
|
470
561
|
@instance = SomethingExpected.new
|
471
562
|
@instance.some_value = 'string'
|
472
563
|
end
|
473
564
|
|
474
|
-
it "passes when attribute
|
565
|
+
it "passes when attribute matches expected value after executing block" do
|
475
566
|
expect { @instance.some_value = "cat" }.to change(@instance, :some_value).to("cat")
|
476
567
|
end
|
477
568
|
|
478
|
-
it "
|
479
|
-
expected = "cat"
|
480
|
-
expected.should_receive(:===).and_return true
|
481
|
-
expect { @instance.some_value = "cat" }.to change(@instance, :some_value).to(expected)
|
482
|
-
end
|
483
|
-
|
484
|
-
it "fails when attribute is not === to expected value after executing block" do
|
569
|
+
it "fails when attribute does not match expected value after executing block" do
|
485
570
|
expect do
|
486
571
|
expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("string").to("dog")
|
487
|
-
end.to fail_with("some_value
|
572
|
+
end.to fail_with("expected #some_value to have changed to \"dog\", but is now \"cat\"")
|
573
|
+
end
|
574
|
+
|
575
|
+
it "fails with a clear message when it ends with the right value but did not change" do
|
576
|
+
expect {
|
577
|
+
expect { }.to change(@instance, :some_value).to("string")
|
578
|
+
}.to fail_with('expected #some_value to have changed to "string", but did not change')
|
488
579
|
end
|
489
580
|
end
|
490
581
|
end
|
@@ -495,20 +586,18 @@ describe "expect { ... }.to change { block }.to(new)" do
|
|
495
586
|
@instance.some_value = 'string'
|
496
587
|
end
|
497
588
|
|
498
|
-
it "passes when attribute
|
589
|
+
it "passes when attribute matches expected value after executing block" do
|
499
590
|
expect { @instance.some_value = "cat" }.to change{@instance.some_value}.to("cat")
|
500
591
|
end
|
501
592
|
|
502
|
-
it "
|
503
|
-
expected = "cat"
|
504
|
-
expected.should_receive(:===).and_return true
|
505
|
-
expect { @instance.some_value = "cat" }.to change{@instance.some_value}.to(expected)
|
506
|
-
end
|
507
|
-
|
508
|
-
it "fails when attribute is not === to expected value after executing block" do
|
593
|
+
it "fails when attribute does not match expected value after executing block" do
|
509
594
|
expect do
|
510
595
|
expect { @instance.some_value = "cat" }.to change{@instance.some_value}.from("string").to("dog")
|
511
|
-
end.to fail_with("result
|
596
|
+
end.to fail_with("expected result to have changed to \"dog\", but is now \"cat\"")
|
597
|
+
end
|
598
|
+
|
599
|
+
it "provides a #description" do
|
600
|
+
expect(change { }.to(3).description).to eq "change result to 3"
|
512
601
|
end
|
513
602
|
end
|
514
603
|
|
@@ -529,13 +618,13 @@ describe "expect { ... }.to change(actual, message).from(old).to(new)" do
|
|
529
618
|
it "shows the correct messaging when #after and #to are different" do
|
530
619
|
expect do
|
531
620
|
expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("string").to("dog")
|
532
|
-
end.to fail_with("some_value
|
621
|
+
end.to fail_with("expected #some_value to have changed to \"dog\", but is now \"cat\"")
|
533
622
|
end
|
534
623
|
|
535
624
|
it "shows the correct messaging when #before and #from are different" do
|
536
625
|
expect do
|
537
626
|
expect { @instance.some_value = "cat" }.to change(@instance, :some_value).from("not_string").to("cat")
|
538
|
-
end.to fail_with("some_value
|
627
|
+
end.to fail_with("expected #some_value to have initially been \"not_string\", but was \"string\"")
|
539
628
|
end
|
540
629
|
end
|
541
630
|
|
@@ -545,12 +634,130 @@ describe "expect { ... }.to change { block }.from(old).to(new)" do
|
|
545
634
|
@instance.some_value = 'string'
|
546
635
|
end
|
547
636
|
|
548
|
-
|
549
|
-
|
637
|
+
context "when #to comes before #from" do
|
638
|
+
it "passes" do
|
639
|
+
expect { @instance.some_value = "cat" }.to change{@instance.some_value}.to("cat").from("string")
|
640
|
+
end
|
641
|
+
|
642
|
+
it "provides a #description" do
|
643
|
+
expect(change { }.to(1).from(3).description).to eq "change result to 1 from 3"
|
644
|
+
end
|
550
645
|
end
|
551
646
|
|
552
|
-
|
553
|
-
|
647
|
+
context "when #from comes before #to" do
|
648
|
+
it "passes" do
|
649
|
+
expect { @instance.some_value = "cat" }.to change{@instance.some_value}.from("string").to("cat")
|
650
|
+
end
|
651
|
+
|
652
|
+
it "provides a #description" do
|
653
|
+
expect(change { }.from(1).to(3).description).to eq "change result from 1 to 3"
|
654
|
+
end
|
655
|
+
end
|
656
|
+
end
|
657
|
+
|
658
|
+
describe "Composing a matcher with `change`" do
|
659
|
+
describe "expect { ... }.to change { ... }" do
|
660
|
+
context ".from(matcher).to(matcher)" do
|
661
|
+
it 'passes when the matchers match the from and to values' do
|
662
|
+
k = 0.51
|
663
|
+
expect { k += 1 }.to change { k }.
|
664
|
+
from( a_value_within(0.1).of(0.5) ).
|
665
|
+
to( a_value_within(0.1).of(1.5) )
|
666
|
+
end
|
667
|
+
|
668
|
+
it 'fails with a clear message when the `from` does not match' do
|
669
|
+
expect {
|
670
|
+
k = 0.51
|
671
|
+
expect { k += 1 }.to change { k }.
|
672
|
+
from( a_value_within(0.1).of(0.7) ).
|
673
|
+
to( a_value_within(0.1).of(1.5) )
|
674
|
+
}.to fail_with(/expected result to have initially been a value within 0.1 of 0.7, but was 0.51/)
|
675
|
+
end
|
676
|
+
|
677
|
+
it 'fails with a clear message when the `to` does not match' do
|
678
|
+
expect {
|
679
|
+
k = 0.51
|
680
|
+
expect { k += 1 }.to change { k }.
|
681
|
+
from( a_value_within(0.1).of(0.5) ).
|
682
|
+
to( a_value_within(0.1).of(2.5) )
|
683
|
+
}.to fail_with(/expected result to have changed to a value within 0.1 of 2.5, but is now 1.51/)
|
684
|
+
end
|
685
|
+
|
686
|
+
it 'provides a description' do
|
687
|
+
expect(change(nil, :foo).
|
688
|
+
from( a_value_within(0.1).of(0.5) ).
|
689
|
+
to( a_value_within(0.1).of(1.5) ).description
|
690
|
+
).to eq("change #foo from a value within 0.1 of 0.5 to a value within 0.1 of 1.5")
|
691
|
+
end
|
692
|
+
end
|
693
|
+
|
694
|
+
context ".to(matcher).from(matcher)" do
|
695
|
+
it 'passes when the matchers match the from and to values' do
|
696
|
+
k = 0.51
|
697
|
+
expect { k += 1 }.to change { k }.
|
698
|
+
to( a_value_within(0.1).of(1.5) ).
|
699
|
+
from( a_value_within(0.1).of(0.5) )
|
700
|
+
end
|
701
|
+
|
702
|
+
it 'fails with a clear message when the `from` does not match' do
|
703
|
+
expect {
|
704
|
+
k = 0.51
|
705
|
+
expect { k += 1 }.to change { k }.
|
706
|
+
to( a_value_within(0.1).of(1.5) ).
|
707
|
+
from( a_value_within(0.1).of(0.7) )
|
708
|
+
}.to fail_with(/expected result to have initially been a value within 0.1 of 0.7, but was 0.51/)
|
709
|
+
end
|
710
|
+
|
711
|
+
it 'fails with a clear message when the `to` does not match' do
|
712
|
+
expect {
|
713
|
+
k = 0.51
|
714
|
+
expect { k += 1 }.to change { k }.
|
715
|
+
to( a_value_within(0.1).of(2.5) ).
|
716
|
+
from( a_value_within(0.1).of(0.5) )
|
717
|
+
}.to fail_with(/expected result to have changed to a value within 0.1 of 2.5, but is now 1.51/)
|
718
|
+
end
|
719
|
+
|
720
|
+
it 'provides a description' do
|
721
|
+
expect(change(nil, :foo).
|
722
|
+
to( a_value_within(0.1).of(0.5) ).
|
723
|
+
from( a_value_within(0.1).of(1.5) ).description
|
724
|
+
).to eq("change #foo to a value within 0.1 of 0.5 from a value within 0.1 of 1.5")
|
725
|
+
end
|
726
|
+
end
|
727
|
+
|
728
|
+
context ".by(matcher)" do
|
729
|
+
it "passes when the matcher matches" do
|
730
|
+
k = 0.5
|
731
|
+
expect { k += 1.05 }.to change { k }.by( a_value_within(0.1).of(1) )
|
732
|
+
end
|
733
|
+
|
734
|
+
it 'fails with a clear message when the `by` does not match' do
|
735
|
+
expect {
|
736
|
+
k = 0.5
|
737
|
+
expect { k += 1.05 }.to change { k }.by( a_value_within(0.1).of(0.5) )
|
738
|
+
}.to fail_with(/expected result to have changed by a value within 0.1 of 0.5, but was changed by 1.05/)
|
739
|
+
end
|
740
|
+
|
741
|
+
it 'provides a description' do
|
742
|
+
expect(change(nil, :foo).
|
743
|
+
by( a_value_within(0.1).of(0.5) ).description
|
744
|
+
).to eq("change #foo by a value within 0.1 of 0.5")
|
745
|
+
end
|
746
|
+
end
|
747
|
+
end
|
748
|
+
|
749
|
+
describe "expect { ... }.not_to change { ... }.from(matcher).to(matcher)" do
|
750
|
+
it 'passes when the matcher matches the `from` value and it does not change' do
|
751
|
+
k = 0.51
|
752
|
+
expect { }.not_to change { k }.from( a_value_within(0.1).of(0.5) )
|
753
|
+
end
|
754
|
+
|
755
|
+
it 'fails with a clear message when the `from` matcher does not match' do
|
756
|
+
expect {
|
757
|
+
k = 0.51
|
758
|
+
expect { }.not_to change { k }.from( a_value_within(0.1).of(1.5) )
|
759
|
+
}.to fail_with(/expected result to have initially been a value within 0.1 of 1.5, but was 0.51/)
|
760
|
+
end
|
554
761
|
end
|
555
762
|
end
|
556
763
|
|
@@ -564,4 +771,38 @@ describe RSpec::Matchers::BuiltIn::Change do
|
|
564
771
|
expect { @instance.some_value = "cat" }.to change(@instance, :some_value)
|
565
772
|
}.not_to raise_error
|
566
773
|
end
|
774
|
+
|
775
|
+
k = 1
|
776
|
+
before { k = 1 }
|
777
|
+
it_behaves_like "an RSpec matcher", :valid_value => lambda { k += 1 },
|
778
|
+
:invalid_value => lambda { } do
|
779
|
+
let(:matcher) { change { k } }
|
780
|
+
end
|
781
|
+
end
|
782
|
+
|
783
|
+
describe RSpec::Matchers::BuiltIn::ChangeRelatively do
|
784
|
+
k = 0
|
785
|
+
before { k = 0 }
|
786
|
+
it_behaves_like "an RSpec matcher", :valid_value => lambda { k += 1 },
|
787
|
+
:invalid_value => lambda { k += 2 } do
|
788
|
+
let(:matcher) { change { k }.by(1) }
|
789
|
+
end
|
790
|
+
end
|
791
|
+
|
792
|
+
describe RSpec::Matchers::BuiltIn::ChangeFromValue do
|
793
|
+
k = 0
|
794
|
+
before { k = 0 }
|
795
|
+
it_behaves_like "an RSpec matcher", :valid_value => lambda { k += 1 },
|
796
|
+
:invalid_value => lambda { } do
|
797
|
+
let(:matcher) { change { k }.from(0) }
|
798
|
+
end
|
799
|
+
end
|
800
|
+
|
801
|
+
describe RSpec::Matchers::BuiltIn::ChangeToValue do
|
802
|
+
k = 0
|
803
|
+
before { k = 0 }
|
804
|
+
it_behaves_like "an RSpec matcher", :valid_value => lambda { k = 2 },
|
805
|
+
:invalid_value => lambda { k = 3 } do
|
806
|
+
let(:matcher) { change { k }.to(2) }
|
807
|
+
end
|
567
808
|
end
|