rspec-expectations 2.8.0 → 2.9.0.rc2
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/.document +5 -0
- data/.yardopts +3 -0
- data/Changelog.md +176 -0
- data/README.md +2 -13
- data/features/custom_matchers/access_running_example.feature +1 -1
- data/features/step_definitions/additional_cli_steps.rb +4 -4
- data/lib/rspec/expectations/fail_with.rb +3 -3
- data/lib/rspec/expectations/handler.rb +3 -5
- data/lib/rspec/expectations/version.rb +1 -1
- data/lib/rspec/matchers.rb +387 -21
- data/lib/rspec/matchers/built_in.rb +33 -0
- data/lib/rspec/matchers/built_in/base_matcher.rb +58 -0
- data/lib/rspec/matchers/built_in/be.rb +183 -0
- data/lib/rspec/matchers/built_in/be_instance_of.rb +13 -0
- data/lib/rspec/matchers/built_in/be_kind_of.rb +13 -0
- data/lib/rspec/matchers/built_in/be_within.rb +39 -0
- data/lib/rspec/matchers/built_in/change.rb +132 -0
- data/lib/rspec/matchers/built_in/cover.rb +22 -0
- data/lib/rspec/matchers/built_in/eq.rb +26 -0
- data/lib/rspec/matchers/built_in/eql.rb +25 -0
- data/lib/rspec/matchers/built_in/equal.rb +48 -0
- data/lib/rspec/matchers/built_in/exist.rb +28 -0
- data/lib/rspec/matchers/built_in/has.rb +47 -0
- data/lib/rspec/matchers/built_in/have.rb +107 -0
- data/lib/rspec/matchers/built_in/include.rb +52 -0
- data/lib/rspec/matchers/built_in/match.rb +13 -0
- data/lib/rspec/matchers/built_in/match_array.rb +52 -0
- data/lib/rspec/matchers/built_in/raise_error.rb +96 -0
- data/lib/rspec/matchers/built_in/respond_to.rb +73 -0
- data/lib/rspec/matchers/built_in/satisfy.rb +29 -0
- data/lib/rspec/matchers/built_in/throw_symbol.rb +93 -0
- data/lib/rspec/matchers/dsl.rb +1 -1
- data/lib/rspec/matchers/matcher.rb +263 -233
- data/lib/rspec/matchers/method_missing.rb +2 -2
- data/lib/rspec/matchers/operator_matcher.rb +19 -20
- data/spec/rspec/expectations/handler_spec.rb +1 -1
- data/spec/rspec/matchers/base_matcher_spec.rb +1 -2
- data/spec/rspec/matchers/change_spec.rb +3 -3
- data/spec/rspec/matchers/cover_spec.rb +46 -46
- data/spec/rspec/matchers/dsl_spec.rb +36 -3
- data/spec/rspec/matchers/have_spec.rb +2 -2
- data/spec/rspec/matchers/include_spec.rb +1 -1
- data/spec/rspec/matchers/matcher_spec.rb +319 -305
- data/spec/rspec/matchers/method_missing_spec.rb +1 -0
- data/spec/rspec/matchers/operator_matcher_spec.rb +2 -2
- data/spec/rspec/matchers/throw_symbol_spec.rb +103 -105
- metadata +93 -39
- data/lib/rspec/matchers/base_matcher.rb +0 -56
- data/lib/rspec/matchers/be.rb +0 -232
- data/lib/rspec/matchers/be_instance_of.rb +0 -24
- data/lib/rspec/matchers/be_kind_of.rb +0 -24
- data/lib/rspec/matchers/be_within.rb +0 -47
- data/lib/rspec/matchers/change.rb +0 -197
- data/lib/rspec/matchers/cover.rb +0 -36
- data/lib/rspec/matchers/eq.rb +0 -36
- data/lib/rspec/matchers/eql.rb +0 -35
- data/lib/rspec/matchers/equal.rb +0 -58
- data/lib/rspec/matchers/errors.rb +0 -5
- data/lib/rspec/matchers/exist.rb +0 -34
- data/lib/rspec/matchers/has.rb +0 -44
- data/lib/rspec/matchers/have.rb +0 -162
- data/lib/rspec/matchers/include.rb +0 -66
- data/lib/rspec/matchers/match.rb +0 -21
- data/lib/rspec/matchers/match_array.rb +0 -65
- data/lib/rspec/matchers/raise_error.rb +0 -116
- data/lib/rspec/matchers/respond_to.rb +0 -80
- data/lib/rspec/matchers/satisfy.rb +0 -46
- data/lib/rspec/matchers/throw_symbol.rb +0 -112
data/lib/rspec/matchers/cover.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class Cover
|
4
|
-
include BaseMatcher
|
5
|
-
|
6
|
-
def initialize(*expected)
|
7
|
-
super(expected)
|
8
|
-
end
|
9
|
-
|
10
|
-
def matches?(range)
|
11
|
-
expected.all? {|e| super(range).cover?(e)}
|
12
|
-
end
|
13
|
-
|
14
|
-
def does_not_match?(range)
|
15
|
-
@actual = range
|
16
|
-
expected.none? {|e| range.cover?(e)}
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
# Passes if actual covers expected. This works for
|
21
|
-
# Ranges. You can also pass in multiple args
|
22
|
-
# and it will only pass if all args are found in Range.
|
23
|
-
#
|
24
|
-
# @example
|
25
|
-
# (1..10).should cover(5)
|
26
|
-
# (1..10).should cover(4, 6)
|
27
|
-
# (1..10).should cover(4, 6, 11) # will fail
|
28
|
-
# (1..10).should_not cover(11)
|
29
|
-
# (1..10).should_not cover(5) # will fail
|
30
|
-
#
|
31
|
-
# ### Warning:: Ruby >= 1.9 only
|
32
|
-
def cover(*values)
|
33
|
-
Cover.new(*values)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
data/lib/rspec/matchers/eq.rb
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class Eq
|
4
|
-
include BaseMatcher
|
5
|
-
|
6
|
-
def matches?(actual)
|
7
|
-
super(actual) == expected
|
8
|
-
end
|
9
|
-
|
10
|
-
def failure_message_for_should
|
11
|
-
"\nexpected: #{expected.inspect}\n got: #{actual.inspect}\n\n(compared using ==)\n"
|
12
|
-
end
|
13
|
-
|
14
|
-
def failure_message_for_should_not
|
15
|
-
"\nexpected: value != #{expected.inspect}\n got: #{actual.inspect}\n\n(compared using ==)\n"
|
16
|
-
end
|
17
|
-
|
18
|
-
def diffable?
|
19
|
-
true
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Passes if <tt>actual == expected</tt>.
|
24
|
-
#
|
25
|
-
# See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more information about equality in Ruby.
|
26
|
-
#
|
27
|
-
# @example
|
28
|
-
#
|
29
|
-
# 5.should eq(5)
|
30
|
-
# 5.should_not eq(3)
|
31
|
-
def eq(expected)
|
32
|
-
Eq.new(expected)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
data/lib/rspec/matchers/eql.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class Eql
|
4
|
-
include BaseMatcher
|
5
|
-
|
6
|
-
def matches?(actual)
|
7
|
-
super(actual).eql?(expected)
|
8
|
-
end
|
9
|
-
|
10
|
-
def failure_message_for_should
|
11
|
-
"\nexpected: #{expected.inspect}\n got: #{actual.inspect}\n\n(compared using eql?)\n"
|
12
|
-
end
|
13
|
-
|
14
|
-
def failure_message_for_should_not
|
15
|
-
"\nexpected: value != #{expected.inspect}\n got: #{actual.inspect}\n\n(compared using eql?)\n"
|
16
|
-
end
|
17
|
-
|
18
|
-
def diffable?
|
19
|
-
true
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Passes if +actual.eql?(expected)+
|
24
|
-
#
|
25
|
-
# See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more information about equality in Ruby.
|
26
|
-
#
|
27
|
-
# @example
|
28
|
-
#
|
29
|
-
# 5.should eql(5)
|
30
|
-
# 5.should_not eql(3)
|
31
|
-
def eql(expected)
|
32
|
-
Eql.new(expected)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/rspec/matchers/equal.rb
DELETED
@@ -1,58 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class Equal
|
4
|
-
include BaseMatcher
|
5
|
-
|
6
|
-
def matches?(actual)
|
7
|
-
super(actual).equal?(expected)
|
8
|
-
end
|
9
|
-
|
10
|
-
def failure_message_for_should
|
11
|
-
return <<-MESSAGE
|
12
|
-
|
13
|
-
expected #{inspect_object(expected)}
|
14
|
-
got #{inspect_object(actual)}
|
15
|
-
|
16
|
-
Compared using equal?, which compares object identity,
|
17
|
-
but expected and actual are not the same object. Use
|
18
|
-
'actual.should == expected' if you don't care about
|
19
|
-
object identity in this example.
|
20
|
-
|
21
|
-
MESSAGE
|
22
|
-
end
|
23
|
-
|
24
|
-
def failure_message_for_should_not
|
25
|
-
return <<-MESSAGE
|
26
|
-
|
27
|
-
expected not #{inspect_object(actual)}
|
28
|
-
got #{inspect_object(expected)}
|
29
|
-
|
30
|
-
Compared using equal?, which compares object identity.
|
31
|
-
|
32
|
-
MESSAGE
|
33
|
-
end
|
34
|
-
|
35
|
-
def diffable?
|
36
|
-
true
|
37
|
-
end
|
38
|
-
|
39
|
-
private
|
40
|
-
|
41
|
-
def inspect_object(o)
|
42
|
-
"#<#{o.class}:#{o.object_id}> => #{o.inspect}"
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Passes if <tt>actual.equal?(expected)</tt> (object identity).
|
47
|
-
#
|
48
|
-
# See http://www.ruby-doc.org/core/classes/Object.html#M001057 for more information about equality in Ruby.
|
49
|
-
#
|
50
|
-
# @example
|
51
|
-
#
|
52
|
-
# 5.should equal(5) # Fixnums are equal
|
53
|
-
# "5".should_not equal("5") # Strings that look the same are not the same object
|
54
|
-
def equal(expected)
|
55
|
-
Equal.new(expected)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
data/lib/rspec/matchers/exist.rb
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class Exist
|
4
|
-
include BaseMatcher
|
5
|
-
|
6
|
-
def initialize(*args)
|
7
|
-
super(args)
|
8
|
-
end
|
9
|
-
|
10
|
-
def matches?(actual)
|
11
|
-
super(actual)
|
12
|
-
predicates = [:exist?, :exists?].select { |p| actual.respond_to?(p) }
|
13
|
-
existance_values = predicates.map { |p| actual.send(p, *expected) }
|
14
|
-
uniq_truthy_values = existance_values.map { |v| !!v }.uniq
|
15
|
-
|
16
|
-
case uniq_truthy_values.size
|
17
|
-
when 0; raise NoMethodError.new("#{actual.inspect} does not respond to either #exist? or #exists?")
|
18
|
-
when 1; existance_values.first
|
19
|
-
else raise "#exist? and #exists? returned different values:\n\n" +
|
20
|
-
" exist?: #{existance_values.first}\n" +
|
21
|
-
"exists?: #{existance_values.last}"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# Passes if `actual.exist?` or `actual.exists?`
|
27
|
-
#
|
28
|
-
# @example
|
29
|
-
# File.should exist("path/to/file")
|
30
|
-
def exist(*args)
|
31
|
-
Exist.new(*args)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
data/lib/rspec/matchers/has.rb
DELETED
@@ -1,44 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class Has
|
4
|
-
def initialize(expected, *args)
|
5
|
-
@expected, @args = expected, args
|
6
|
-
end
|
7
|
-
|
8
|
-
def matches?(actual)
|
9
|
-
actual.__send__(predicate(@expected), *@args)
|
10
|
-
end
|
11
|
-
|
12
|
-
def failure_message_for_should
|
13
|
-
"expected ##{predicate(@expected)}#{failure_message_args_description} to return true, got false"
|
14
|
-
end
|
15
|
-
|
16
|
-
def failure_message_for_should_not
|
17
|
-
"expected ##{predicate(@expected)}#{failure_message_args_description} to return false, got true"
|
18
|
-
end
|
19
|
-
|
20
|
-
def description
|
21
|
-
[method_description(@expected), args_description].compact.join(' ')
|
22
|
-
end
|
23
|
-
|
24
|
-
private
|
25
|
-
def predicate(sym)
|
26
|
-
"#{sym.to_s.sub("have_","has_")}?".to_sym
|
27
|
-
end
|
28
|
-
|
29
|
-
def method_description(method)
|
30
|
-
method.to_s.gsub('_', ' ')
|
31
|
-
end
|
32
|
-
|
33
|
-
def args_description
|
34
|
-
return nil if @args.empty?
|
35
|
-
@args.map { |arg| arg.inspect }.join(', ')
|
36
|
-
end
|
37
|
-
|
38
|
-
def failure_message_args_description
|
39
|
-
desc = args_description
|
40
|
-
"(#{desc})" if desc
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
data/lib/rspec/matchers/have.rb
DELETED
@@ -1,162 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class Have
|
4
|
-
def initialize(expected, relativity=:exactly)
|
5
|
-
@expected = case expected
|
6
|
-
when :no then 0
|
7
|
-
when String then expected.to_i
|
8
|
-
else expected
|
9
|
-
end
|
10
|
-
@relativity = relativity
|
11
|
-
@actual = @collection_name = @plural_collection_name = nil
|
12
|
-
end
|
13
|
-
|
14
|
-
def relativities
|
15
|
-
@relativities ||= {
|
16
|
-
:exactly => "",
|
17
|
-
:at_least => "at least ",
|
18
|
-
:at_most => "at most "
|
19
|
-
}
|
20
|
-
end
|
21
|
-
|
22
|
-
def matches?(collection_or_owner)
|
23
|
-
collection = determine_collection(collection_or_owner)
|
24
|
-
query_method = determine_query_method(collection)
|
25
|
-
raise not_a_collection unless query_method
|
26
|
-
@actual = collection.send(query_method)
|
27
|
-
case @relativity
|
28
|
-
when :at_least then @actual >= @expected
|
29
|
-
when :at_most then @actual <= @expected
|
30
|
-
else @actual == @expected
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def determine_collection(collection_or_owner)
|
35
|
-
if collection_or_owner.respond_to?(@collection_name)
|
36
|
-
collection_or_owner.send(@collection_name, *@args, &@block)
|
37
|
-
elsif (@plural_collection_name && collection_or_owner.respond_to?(@plural_collection_name))
|
38
|
-
collection_or_owner.send(@plural_collection_name, *@args, &@block)
|
39
|
-
elsif determine_query_method(collection_or_owner)
|
40
|
-
collection_or_owner
|
41
|
-
else
|
42
|
-
collection_or_owner.send(@collection_name, *@args, &@block)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
def determine_query_method(collection)
|
47
|
-
[:size, :length, :count].detect {|m| collection.respond_to?(m)}
|
48
|
-
end
|
49
|
-
|
50
|
-
def not_a_collection
|
51
|
-
"expected #{@collection_name} to be a collection but it does not respond to #length, #size or #count"
|
52
|
-
end
|
53
|
-
|
54
|
-
def failure_message_for_should
|
55
|
-
"expected #{relative_expectation} #{@collection_name}, got #{@actual}"
|
56
|
-
end
|
57
|
-
|
58
|
-
def failure_message_for_should_not
|
59
|
-
if @relativity == :exactly
|
60
|
-
return "expected target not to have #{@expected} #{@collection_name}, got #{@actual}"
|
61
|
-
elsif @relativity == :at_most
|
62
|
-
return <<-EOF
|
63
|
-
Isn't life confusing enough?
|
64
|
-
Instead of having to figure out the meaning of this:
|
65
|
-
should_not have_at_most(#{@expected}).#{@collection_name}
|
66
|
-
We recommend that you use this instead:
|
67
|
-
should have_at_least(#{@expected + 1}).#{@collection_name}
|
68
|
-
EOF
|
69
|
-
elsif @relativity == :at_least
|
70
|
-
return <<-EOF
|
71
|
-
Isn't life confusing enough?
|
72
|
-
Instead of having to figure out the meaning of this:
|
73
|
-
should_not have_at_least(#{@expected}).#{@collection_name}
|
74
|
-
We recommend that you use this instead:
|
75
|
-
should have_at_most(#{@expected - 1}).#{@collection_name}
|
76
|
-
EOF
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
def description
|
81
|
-
"have #{relative_expectation} #{@collection_name}"
|
82
|
-
end
|
83
|
-
|
84
|
-
def respond_to?(m)
|
85
|
-
@expected.respond_to?(m) || super
|
86
|
-
end
|
87
|
-
|
88
|
-
private
|
89
|
-
|
90
|
-
def method_missing(method, *args, &block)
|
91
|
-
@collection_name = method
|
92
|
-
if inflector = (defined?(ActiveSupport::Inflector) && ActiveSupport::Inflector.respond_to?(:pluralize) ? ActiveSupport::Inflector : (defined?(Inflector) ? Inflector : nil))
|
93
|
-
@plural_collection_name = inflector.pluralize(method.to_s)
|
94
|
-
end
|
95
|
-
@args = args
|
96
|
-
@block = block
|
97
|
-
self
|
98
|
-
end
|
99
|
-
|
100
|
-
def relative_expectation
|
101
|
-
"#{relativities[@relativity]}#{@expected}"
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
# Passes if receiver is a collection with the submitted number of items OR
|
106
|
-
# if the receiver OWNS a collection with the submitted number of items.
|
107
|
-
#
|
108
|
-
# If the receiver OWNS the collection, you must use the name of the
|
109
|
-
# collection. So if a `Team` instance has a collection named `#players`,
|
110
|
-
# you must use that name to set the expectation.
|
111
|
-
#
|
112
|
-
# If the receiver IS the collection, you can use any name you like for
|
113
|
-
# `named_collection`. We'd recommend using either "elements", "members", or
|
114
|
-
# "items" as these are all standard ways of describing the things IN a
|
115
|
-
# collection.
|
116
|
-
#
|
117
|
-
# This also works for Strings, letting you set expectations about their
|
118
|
-
# lengths.
|
119
|
-
#
|
120
|
-
# @example
|
121
|
-
#
|
122
|
-
# # Passes if team.players.size == 11
|
123
|
-
# team.should have(11).players
|
124
|
-
#
|
125
|
-
# # Passes if [1,2,3].length == 3
|
126
|
-
# [1,2,3].should have(3).items #"items" is pure sugar
|
127
|
-
#
|
128
|
-
# # Passes if ['a', 'b', 'c'].count == 3
|
129
|
-
# [1,2,3].should have(3).items #"items" is pure sugar
|
130
|
-
#
|
131
|
-
# # Passes if "this string".length == 11
|
132
|
-
# "this string".should have(11).characters #"characters" is pure sugar
|
133
|
-
def have(n)
|
134
|
-
Matchers::Have.new(n)
|
135
|
-
end
|
136
|
-
alias :have_exactly :have
|
137
|
-
|
138
|
-
# Exactly like have() with >=.
|
139
|
-
#
|
140
|
-
# @example
|
141
|
-
# "this".should have_at_least(3).letters
|
142
|
-
#
|
143
|
-
# ### Warning:
|
144
|
-
#
|
145
|
-
# `should_not have_at_least` is not supported
|
146
|
-
def have_at_least(n)
|
147
|
-
Matchers::Have.new(n, :at_least)
|
148
|
-
end
|
149
|
-
|
150
|
-
# Exactly like have() with <=.
|
151
|
-
#
|
152
|
-
# @example
|
153
|
-
# should have_at_most(number).items
|
154
|
-
#
|
155
|
-
# ### Warning:
|
156
|
-
#
|
157
|
-
# `should_not have_at_most` is not supported
|
158
|
-
def have_at_most(n)
|
159
|
-
Matchers::Have.new(n, :at_most)
|
160
|
-
end
|
161
|
-
end
|
162
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
module RSpec
|
2
|
-
module Matchers
|
3
|
-
class Include
|
4
|
-
include BaseMatcher
|
5
|
-
|
6
|
-
def initialize(*expected)
|
7
|
-
super(expected)
|
8
|
-
end
|
9
|
-
|
10
|
-
def matches?(actual)
|
11
|
-
perform_match(:all?, :all?, super(actual), expected)
|
12
|
-
end
|
13
|
-
|
14
|
-
def does_not_match?(actual)
|
15
|
-
@actual = actual
|
16
|
-
perform_match(:none?, :any?, actual, expected)
|
17
|
-
end
|
18
|
-
|
19
|
-
def description
|
20
|
-
"include#{expected_to_sentence}"
|
21
|
-
end
|
22
|
-
|
23
|
-
def diffable?
|
24
|
-
true
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def perform_match(predicate, hash_predicate, actuals, expecteds)
|
30
|
-
expecteds.send(predicate) do |expected|
|
31
|
-
if comparing_hash_values?(actuals, expected)
|
32
|
-
expected.send(hash_predicate) {|k,v| actuals[k] == v}
|
33
|
-
elsif comparing_hash_keys?(actuals, expected)
|
34
|
-
actuals.has_key?(expected)
|
35
|
-
else
|
36
|
-
actuals.include?(expected)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
def comparing_hash_keys?(actual, expected)
|
42
|
-
actual.is_a?(Hash) && !expected.is_a?(Hash)
|
43
|
-
end
|
44
|
-
|
45
|
-
def comparing_hash_values?(actual, expected)
|
46
|
-
actual.is_a?(Hash) && expected.is_a?(Hash)
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
# Passes if actual includes expected. This works for
|
51
|
-
# collections and Strings. You can also pass in multiple args
|
52
|
-
# and it will only pass if all args are found in collection.
|
53
|
-
#
|
54
|
-
# @example
|
55
|
-
#
|
56
|
-
# [1,2,3].should include(3)
|
57
|
-
# [1,2,3].should include(2,3) #would pass
|
58
|
-
# [1,2,3].should include(2,3,4) #would fail
|
59
|
-
# [1,2,3].should_not include(4)
|
60
|
-
# "spread".should include("read")
|
61
|
-
# "spread".should_not include("red")
|
62
|
-
def include(*expected)
|
63
|
-
Include.new(*expected)
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|