rspec-expectations 2.14.5 → 2.99.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -7
- data/Changelog.md +22 -4
- data/features/built_in_matchers/be.feature +40 -40
- data/lib/rspec/expectations/caller_filter.rb +55 -0
- data/lib/rspec/expectations/deprecation.rb +3 -15
- data/lib/rspec/expectations/version.rb +1 -2
- data/lib/rspec/matchers.rb +24 -6
- data/lib/rspec/matchers/built_in.rb +2 -2
- data/lib/rspec/matchers/built_in/base_matcher.rb +5 -7
- data/lib/rspec/matchers/built_in/be.rb +24 -6
- data/lib/rspec/matchers/built_in/have.rb +97 -1
- data/lib/rspec/matchers/differentiate_block_method_types.rb +55 -0
- data/lib/rspec/matchers/matcher.rb +85 -2
- data/spec/rspec/expectations/handler_spec.rb +1 -1
- data/spec/rspec/expectations/syntax_spec.rb +6 -6
- data/spec/rspec/expectations_spec.rb +14 -0
- data/spec/rspec/matchers/base_matcher_spec.rb +8 -29
- data/spec/rspec/matchers/be_spec.rb +84 -10
- data/spec/rspec/matchers/description_generation_spec.rb +21 -17
- data/spec/rspec/matchers/differentiate_block_method_types_spec.rb +39 -0
- data/spec/rspec/matchers/eq_spec.rb +1 -1
- data/spec/rspec/matchers/equal_spec.rb +0 -26
- data/spec/rspec/matchers/have_spec.rb +301 -1
- data/spec/rspec/matchers/matcher_spec.rb +148 -24
- data/spec/rspec/matchers/operator_matcher_spec.rb +3 -3
- data/spec/rspec/matchers/raise_error_spec.rb +3 -3
- data/spec/rspec/matchers/throw_symbol_spec.rb +14 -14
- data/spec/spec_helper.rb +23 -0
- data/spec/support/helper_methods.rb +11 -0
- metadata +79 -59
@@ -25,14 +25,14 @@ describe "Matchers should be able to generate their own descriptions" do
|
|
25
25
|
expect(RSpec::Matchers.generated_description).to eq "should not be empty"
|
26
26
|
end
|
27
27
|
|
28
|
-
it "expect(...).to be
|
29
|
-
expect(true).to
|
30
|
-
expect(RSpec::Matchers.generated_description).to eq "should be
|
28
|
+
it "expect(...).to be truthy" do
|
29
|
+
expect(true).to be_truthy
|
30
|
+
expect(RSpec::Matchers.generated_description).to eq "should be truthy"
|
31
31
|
end
|
32
32
|
|
33
|
-
it "expect(...).to be
|
34
|
-
expect(false).to
|
35
|
-
expect(RSpec::Matchers.generated_description).to eq "should be
|
33
|
+
it "expect(...).to be falsey" do
|
34
|
+
expect(false).to be_falsey
|
35
|
+
expect(RSpec::Matchers.generated_description).to eq "should be falsey"
|
36
36
|
end
|
37
37
|
|
38
38
|
it "expect(...).to be nil" do
|
@@ -92,19 +92,23 @@ describe "Matchers should be able to generate their own descriptions" do
|
|
92
92
|
expect(RSpec::Matchers.generated_description).to eq 'should have taste for "wine", "cheese"'
|
93
93
|
end
|
94
94
|
|
95
|
-
|
96
|
-
|
97
|
-
expect(RSpec::Matchers.generated_description).to eq "should have 3 players"
|
98
|
-
end
|
95
|
+
context "the deprecated collection cardinality matchers" do
|
96
|
+
before { allow_deprecation }
|
99
97
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
98
|
+
it "expect(...).to have n items" do
|
99
|
+
expect(team).to have(3).players
|
100
|
+
expect(RSpec::Matchers.generated_description).to eq "should have 3 players"
|
101
|
+
end
|
102
|
+
|
103
|
+
it "expect(...).to have at least n items" do
|
104
|
+
expect(team).to have_at_least(2).players
|
105
|
+
expect(RSpec::Matchers.generated_description).to eq "should have at least 2 players"
|
106
|
+
end
|
104
107
|
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
+
it "expect(...).to have at most n items" do
|
109
|
+
expect(team).to have_at_most(4).players
|
110
|
+
expect(RSpec::Matchers.generated_description).to eq "should have at most 4 players"
|
111
|
+
end
|
108
112
|
end
|
109
113
|
|
110
114
|
it "expect(...).to include(x)" do
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RSpec
|
4
|
+
module Matchers
|
5
|
+
describe DifferentiateBlockMethodTypes do
|
6
|
+
let(:differentiator) do
|
7
|
+
DifferentiateBlockMethodTypes.new do
|
8
|
+
def some_instance_method_1; end
|
9
|
+
def self.some_singleton_method_1; end
|
10
|
+
define_method(:some_instance_method_2) { }
|
11
|
+
|
12
|
+
if RUBY_VERSION.to_f > 1.8
|
13
|
+
define_singleton_method(:some_singleton_method_2) { }
|
14
|
+
else
|
15
|
+
def self.some_singleton_method_2; end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'differentiates singleton method defs from instance method defs' do
|
21
|
+
expect(differentiator.instance_methods).to eq([:some_instance_method_1, :some_instance_method_2])
|
22
|
+
expect(differentiator.singleton_methods).to eq([:some_singleton_method_1, :some_singleton_method_2])
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'passes the given args through to the block' do
|
26
|
+
expect { |b|
|
27
|
+
DifferentiateBlockMethodTypes.new(1, 2, &b)
|
28
|
+
}.to yield_with_args(1, 2)
|
29
|
+
end
|
30
|
+
|
31
|
+
it 'ignores unrecognized DSL methods called in the block' do
|
32
|
+
expect {
|
33
|
+
DifferentiateBlockMethodTypes.new { foo.bar; some_dsl { nested } }
|
34
|
+
}.not_to raise_error
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -24,32 +24,6 @@ module RSpec
|
|
24
24
|
expect(matcher.description).to eq "equal 1"
|
25
25
|
end
|
26
26
|
|
27
|
-
context "when the expected object is falsey in conditinal semantics" do
|
28
|
-
it "describes itself with the expected object" do
|
29
|
-
matcher = equal(nil)
|
30
|
-
matcher.matches?(nil)
|
31
|
-
expect(matcher.description).to eq "equal nil"
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context "when the expected object's #equal? always returns true" do
|
36
|
-
let(:strange_string) do
|
37
|
-
string = "foo"
|
38
|
-
|
39
|
-
def string.equal?(other)
|
40
|
-
true
|
41
|
-
end
|
42
|
-
|
43
|
-
string
|
44
|
-
end
|
45
|
-
|
46
|
-
it "describes itself with the expected object" do
|
47
|
-
matcher = equal(strange_string)
|
48
|
-
matcher.matches?(strange_string)
|
49
|
-
expect(matcher.description).to eq 'equal "foo"'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
27
|
it "suggests the `eq` matcher on failure" do
|
54
28
|
expected, actual = "1", "1"
|
55
29
|
expect {
|
@@ -10,7 +10,10 @@ describe "have matcher" do
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
before(:each)
|
13
|
+
before(:each) do
|
14
|
+
stub_const("ActiveSupport::Inflector", inflector)
|
15
|
+
allow_deprecation
|
16
|
+
end
|
14
17
|
|
15
18
|
def create_collection_owner_with(n)
|
16
19
|
owner = RSpec::Expectations::Helper::CollectionOwner.new
|
@@ -452,4 +455,301 @@ EOF
|
|
452
455
|
end
|
453
456
|
end
|
454
457
|
end
|
458
|
+
|
459
|
+
context "deprecations for the have matcher" do
|
460
|
+
it "has the correct call site in the deprecation message" do
|
461
|
+
expect_deprecation_with_call_site(__FILE__, __LINE__ + 1)
|
462
|
+
expect([1, 2, 3]).to have(3).items
|
463
|
+
end
|
464
|
+
|
465
|
+
context "when the target is a collection" do
|
466
|
+
it "prints a specific message for the positive expectation format" do
|
467
|
+
expectation_expression = "expect(collection).to have(3).items"
|
468
|
+
|
469
|
+
message = "the rspec-collection_matchers gem " +
|
470
|
+
"or replace your expectation with something like " +
|
471
|
+
"`expect(collection.size).to eq(3)`"
|
472
|
+
|
473
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
474
|
+
|
475
|
+
expect([1, 2, 3]).to have(3).items
|
476
|
+
end
|
477
|
+
|
478
|
+
it "prints a specific message for the negative expectation format" do
|
479
|
+
expectation_expression = "expect(collection).not_to have(4).items"
|
480
|
+
|
481
|
+
message = "the rspec-collection_matchers gem " +
|
482
|
+
"or replace your expectation with something like " +
|
483
|
+
"`expect(collection.size).to_not eq(4)`"
|
484
|
+
|
485
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
486
|
+
|
487
|
+
expect([1, 2, 3]).to_not have(4).items
|
488
|
+
end
|
489
|
+
end
|
490
|
+
|
491
|
+
context "when the target owns a collection" do
|
492
|
+
class self::BagOfWords
|
493
|
+
attr_reader :words
|
494
|
+
|
495
|
+
def initialize(words)
|
496
|
+
@words = words
|
497
|
+
end
|
498
|
+
end
|
499
|
+
|
500
|
+
it "prints a specific message for the positive expectation format" do
|
501
|
+
expectation_expression = "expect(collection_owner).to have(3).words"
|
502
|
+
|
503
|
+
message = "the rspec-collection_matchers gem " +
|
504
|
+
"or replace your expectation with something like " +
|
505
|
+
"`expect(collection_owner.words.size).to eq(3)`"
|
506
|
+
|
507
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
508
|
+
|
509
|
+
target = BagOfWords.new(%w[foo bar baz])
|
510
|
+
expect(target).to have(3).words
|
511
|
+
end
|
512
|
+
|
513
|
+
it "prints a specific message for the negative expectation format" do
|
514
|
+
expectation_expression = "expect(collection_owner).not_to have(4).words"
|
515
|
+
|
516
|
+
message = "the rspec-collection_matchers gem " +
|
517
|
+
"or replace your expectation with something like " +
|
518
|
+
"`expect(collection_owner.words.size).to_not eq(4)`"
|
519
|
+
|
520
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
521
|
+
|
522
|
+
target = BagOfWords.new(%w[foo bar baz])
|
523
|
+
expect(target).to_not have(4).words
|
524
|
+
end
|
525
|
+
end
|
526
|
+
|
527
|
+
context "when the target is an enumerator" do
|
528
|
+
it "prints a specific message for the positive expectation format" do
|
529
|
+
target = %w[a b c].to_enum(:each)
|
530
|
+
|
531
|
+
expectation_expression = "expect(collection).to have(3).letters"
|
532
|
+
|
533
|
+
message = "the rspec-collection_matchers gem " +
|
534
|
+
"or replace your expectation with something like " +
|
535
|
+
"`expect(collection.count).to eq(3)`"
|
536
|
+
|
537
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
538
|
+
|
539
|
+
expect(target).to have(3).letters
|
540
|
+
end
|
541
|
+
|
542
|
+
it "prints a specific message for the negative expectation format" do
|
543
|
+
target = %w[a b c].to_enum(:each)
|
544
|
+
|
545
|
+
expectation_expression = "expect(collection).not_to have(4).letters"
|
546
|
+
|
547
|
+
message = "the rspec-collection_matchers gem " +
|
548
|
+
"or replace your expectation with something like " +
|
549
|
+
"`expect(collection.count).to_not eq(4)`"
|
550
|
+
|
551
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
552
|
+
|
553
|
+
expect(target).to_not have(4).letters
|
554
|
+
end
|
555
|
+
end
|
556
|
+
end
|
557
|
+
|
558
|
+
context "deprecations for the have_at_most matcher" do
|
559
|
+
it "has the correct call site in the deprecation message" do
|
560
|
+
expect_deprecation_with_call_site(__FILE__, __LINE__ + 1)
|
561
|
+
expect([1, 2, 3]).to have_at_most(3).items
|
562
|
+
end
|
563
|
+
|
564
|
+
context "when the target is a collection" do
|
565
|
+
it "prints a specific message for the positive expectation format" do
|
566
|
+
expectation_expression = "expect(collection).to have_at_most(3).items"
|
567
|
+
|
568
|
+
message = "the rspec-collection_matchers gem " +
|
569
|
+
"or replace your expectation with something like " +
|
570
|
+
"`expect(collection.size).to be <= 3`"
|
571
|
+
|
572
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
573
|
+
|
574
|
+
expect([1, 2, 3]).to have_at_most(3).items
|
575
|
+
end
|
576
|
+
|
577
|
+
it "prints a specific message for the negative expectation format" do
|
578
|
+
expectation_expression = "expect(collection).not_to have_at_most(2).items"
|
579
|
+
|
580
|
+
message = "the rspec-collection_matchers gem " +
|
581
|
+
"or replace your expectation with something like " +
|
582
|
+
"`expect(collection.size).to be > 2`"
|
583
|
+
|
584
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
585
|
+
|
586
|
+
expect([1, 2, 3]).to_not have_at_most(2).items
|
587
|
+
end
|
588
|
+
end
|
589
|
+
|
590
|
+
context "when the target owns a collection" do
|
591
|
+
class self::BagOfWords
|
592
|
+
attr_reader :words
|
593
|
+
|
594
|
+
def initialize(words)
|
595
|
+
@words = words
|
596
|
+
end
|
597
|
+
end
|
598
|
+
|
599
|
+
it "prints a specific message for the positive expectation format" do
|
600
|
+
expectation_expression = "expect(collection_owner).to have_at_most(3).words"
|
601
|
+
|
602
|
+
message = "the rspec-collection_matchers gem " +
|
603
|
+
"or replace your expectation with something like " +
|
604
|
+
"`expect(collection_owner.words.size).to be <= 3`"
|
605
|
+
|
606
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
607
|
+
|
608
|
+
target = BagOfWords.new(%w[foo bar baz])
|
609
|
+
expect(target).to have_at_most(3).words
|
610
|
+
end
|
611
|
+
|
612
|
+
it "prints a specific message for the negative expectation format" do
|
613
|
+
expectation_expression = "expect(collection_owner).not_to have_at_most(2).words"
|
614
|
+
|
615
|
+
message = "the rspec-collection_matchers gem " +
|
616
|
+
"or replace your expectation with something like " +
|
617
|
+
"`expect(collection_owner.words.size).to be > 2`"
|
618
|
+
|
619
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
620
|
+
|
621
|
+
target = BagOfWords.new(%w[foo bar baz])
|
622
|
+
expect(target).to_not have_at_most(2).words
|
623
|
+
end
|
624
|
+
end
|
625
|
+
|
626
|
+
context "when the target is an enumerator" do
|
627
|
+
it "prints a specific message for the positive expectation format" do
|
628
|
+
target = %w[a b c].to_enum(:each)
|
629
|
+
|
630
|
+
expectation_expression = "expect(collection).to have_at_most(3).letters"
|
631
|
+
|
632
|
+
message = "the rspec-collection_matchers gem " +
|
633
|
+
"or replace your expectation with something like " +
|
634
|
+
"`expect(collection.count).to be <= 3`"
|
635
|
+
|
636
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
637
|
+
|
638
|
+
expect(target).to have_at_most(3).letters
|
639
|
+
end
|
640
|
+
|
641
|
+
it "prints a specific message for the negative expectation format" do
|
642
|
+
target = %w[a b c].to_enum(:each)
|
643
|
+
|
644
|
+
expectation_expression = "expect(collection).not_to have_at_most(2).letters"
|
645
|
+
|
646
|
+
message = "the rspec-collection_matchers gem " +
|
647
|
+
"or replace your expectation with something like " +
|
648
|
+
"`expect(collection.count).to be > 2`"
|
649
|
+
|
650
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
651
|
+
|
652
|
+
expect(target).to_not have_at_most(2).letters
|
653
|
+
end
|
654
|
+
end
|
655
|
+
end
|
656
|
+
|
657
|
+
context "deprecations for the have_at_least matcher" do
|
658
|
+
it "has the correct call site in the deprecation message" do
|
659
|
+
expect_deprecation_with_call_site(__FILE__, __LINE__ + 1)
|
660
|
+
expect([1, 2, 3]).to have_at_least(3).items
|
661
|
+
end
|
662
|
+
|
663
|
+
context "when the target is a collection" do
|
664
|
+
it "prints a specific message for the positive expectation format" do
|
665
|
+
expectation_expression = "expect(collection).to have_at_least(3).items"
|
666
|
+
|
667
|
+
message = "the rspec-collection_matchers gem " +
|
668
|
+
"or replace your expectation with something like " +
|
669
|
+
"`expect(collection.size).to be >= 3`"
|
670
|
+
|
671
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
672
|
+
|
673
|
+
expect([1, 2, 3]).to have_at_least(3).items
|
674
|
+
end
|
675
|
+
|
676
|
+
it "prints a specific message for the negative expectation format" do
|
677
|
+
expectation_expression = "expect(collection).not_to have_at_least(4).items"
|
678
|
+
|
679
|
+
message = "the rspec-collection_matchers gem " +
|
680
|
+
"or replace your expectation with something like " +
|
681
|
+
"`expect(collection.size).to be < 4`"
|
682
|
+
|
683
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
684
|
+
|
685
|
+
expect([1, 2, 3]).to_not have_at_least(4).items
|
686
|
+
end
|
687
|
+
end
|
688
|
+
|
689
|
+
context "when the target owns a collection" do
|
690
|
+
class BagOfWords
|
691
|
+
attr_reader :words
|
692
|
+
|
693
|
+
def initialize(words)
|
694
|
+
@words = words
|
695
|
+
end
|
696
|
+
end
|
697
|
+
|
698
|
+
it "prints a specific message for the positive expectation format" do
|
699
|
+
expectation_expression = "expect(collection_owner).to have_at_least(3).words"
|
700
|
+
|
701
|
+
message = "the rspec-collection_matchers gem " +
|
702
|
+
"or replace your expectation with something like " +
|
703
|
+
"`expect(collection_owner.words.size).to be >= 3`"
|
704
|
+
|
705
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
706
|
+
|
707
|
+
target = BagOfWords.new(%w[foo bar baz])
|
708
|
+
expect(target).to have_at_least(3).words
|
709
|
+
end
|
710
|
+
|
711
|
+
it "prints a specific message for the negative expectation format" do
|
712
|
+
expectation_expression = "expect(collection_owner).not_to have_at_least(4).words"
|
713
|
+
|
714
|
+
message = "the rspec-collection_matchers gem " +
|
715
|
+
"or replace your expectation with something like " +
|
716
|
+
"`expect(collection_owner.words.size).to be < 4`"
|
717
|
+
|
718
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
719
|
+
|
720
|
+
target = BagOfWords.new(%w[foo bar baz])
|
721
|
+
expect(target).to_not have_at_least(4).words
|
722
|
+
end
|
723
|
+
end
|
724
|
+
|
725
|
+
context "when the target is an enumerator" do
|
726
|
+
it "prints a specific message for the positive expectation format" do
|
727
|
+
target = %w[a b c].to_enum(:each)
|
728
|
+
|
729
|
+
expectation_expression = "expect(collection).to have_at_least(3).letters"
|
730
|
+
|
731
|
+
message = "the rspec-collection_matchers gem " +
|
732
|
+
"or replace your expectation with something like " +
|
733
|
+
"`expect(collection.count).to be >= 3`"
|
734
|
+
|
735
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
736
|
+
|
737
|
+
expect(target).to have_at_least(3).letters
|
738
|
+
end
|
739
|
+
|
740
|
+
it "prints a specific message for the negative expectation format" do
|
741
|
+
target = %w[a b c].to_enum(:each)
|
742
|
+
|
743
|
+
expectation_expression = "expect(collection).not_to have_at_least(4).letters"
|
744
|
+
|
745
|
+
message = "the rspec-collection_matchers gem " +
|
746
|
+
"or replace your expectation with something like " +
|
747
|
+
"`expect(collection.count).to be < 4`"
|
748
|
+
|
749
|
+
expect(RSpec).to receive(:deprecate).with("`#{expectation_expression}`", :replacement => message)
|
750
|
+
|
751
|
+
expect(target).to_not have_at_least(4).letters
|
752
|
+
end
|
753
|
+
end
|
754
|
+
end
|
455
755
|
end
|