shoulda-matchers 4.4.0 → 5.0.0
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.
- checksums.yaml +4 -4
- data/LICENSE +22 -0
- data/README.md +18 -18
- data/lib/shoulda/matchers.rb +12 -13
- data/lib/shoulda/matchers/action_controller.rb +13 -13
- data/lib/shoulda/matchers/action_controller/callback_matcher.rb +4 -89
- data/lib/shoulda/matchers/action_controller/filter_param_matcher.rb +3 -2
- data/lib/shoulda/matchers/action_controller/flash_store.rb +2 -4
- data/lib/shoulda/matchers/action_controller/permit_matcher.rb +29 -27
- 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.rb +25 -15
- data/lib/shoulda/matchers/active_model/allow_value_matcher.rb +29 -36
- 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 +2 -2
- data/lib/shoulda/matchers/active_model/numericality_matchers.rb +0 -5
- data/lib/shoulda/matchers/active_model/numericality_matchers/comparison_matcher.rb +32 -34
- 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 +10 -2
- data/lib/shoulda/matchers/active_model/validate_confirmation_of_matcher.rb +2 -2
- data/lib/shoulda/matchers/active_model/validate_exclusion_of_matcher.rb +8 -7
- data/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb +26 -25
- data/lib/shoulda/matchers/active_model/validate_length_of_matcher.rb +6 -6
- data/lib/shoulda/matchers/active_model/validate_numericality_of_matcher.rb +40 -27
- data/lib/shoulda/matchers/active_model/validate_presence_of_matcher.rb +4 -4
- data/lib/shoulda/matchers/active_model/validation_matcher.rb +6 -8
- 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 +4 -9
- data/lib/shoulda/matchers/active_record.rb +26 -14
- data/lib/shoulda/matchers/active_record/accept_nested_attributes_for_matcher.rb +6 -3
- data/lib/shoulda/matchers/active_record/association_matcher.rb +101 -48
- data/lib/shoulda/matchers/active_record/association_matchers.rb +0 -12
- 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 +2 -9
- data/lib/shoulda/matchers/active_record/association_matchers/model_reflector.rb +12 -7
- 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 +4 -4
- 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 +18 -9
- data/lib/shoulda/matchers/active_record/have_attached_matcher.rb +46 -8
- data/lib/shoulda/matchers/active_record/have_db_column_matcher.rb +39 -17
- data/lib/shoulda/matchers/active_record/have_db_index_matcher.rb +1 -1
- data/lib/shoulda/matchers/active_record/have_implicit_order_column.rb +7 -7
- data/lib/shoulda/matchers/active_record/have_readonly_attribute_matcher.rb +12 -10
- data/lib/shoulda/matchers/active_record/have_rich_text_matcher.rb +11 -7
- data/lib/shoulda/matchers/active_record/have_secure_token_matcher.rb +2 -0
- data/lib/shoulda/matchers/active_record/serialize_matcher.rb +13 -9
- data/lib/shoulda/matchers/active_record/uniqueness.rb +4 -4
- 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 +78 -71
- data/lib/shoulda/matchers/doublespeak.rb +9 -9
- 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 +1 -0
- data/lib/shoulda/matchers/independent/delegate_method_matcher.rb +14 -16
- data/lib/shoulda/matchers/integrations.rb +6 -6
- 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.rb +2 -4
- 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 +5 -42
- data/lib/shoulda/matchers/util.rb +9 -2
- data/lib/shoulda/matchers/util/word_wrap.rb +7 -7
- data/lib/shoulda/matchers/version.rb +1 -1
- data/lib/shoulda/matchers/warn.rb +3 -3
- data/shoulda-matchers.gemspec +12 -9
- metadata +14 -14
- data/lib/shoulda/matchers/active_model/allow_mass_assignment_of_matcher.rb +0 -159
@@ -23,7 +23,7 @@ module Shoulda
|
|
23
23
|
@value_written = args.fetch(:value)
|
24
24
|
@ignore_interference_by_writer = args.fetch(
|
25
25
|
:ignore_interference_by_writer,
|
26
|
-
Qualifiers::IgnoreInterferenceByWriter.new
|
26
|
+
Qualifiers::IgnoreInterferenceByWriter.new,
|
27
27
|
)
|
28
28
|
@after_set_callback = args.fetch(:after_set_callback, -> { })
|
29
29
|
|
@@ -36,9 +36,9 @@ module Shoulda
|
|
36
36
|
description << Shoulda::Matchers::Util.inspect_value(value_written)
|
37
37
|
|
38
38
|
if attribute_changed_value?
|
39
|
-
description <<
|
39
|
+
description << ' -- which was read back as '
|
40
40
|
description << Shoulda::Matchers::Util.inspect_value(value_read)
|
41
|
-
description <<
|
41
|
+
description << ' --'
|
42
42
|
end
|
43
43
|
|
44
44
|
description
|
@@ -206,7 +206,7 @@ module Shoulda
|
|
206
206
|
model: object.class,
|
207
207
|
attribute_name: attribute_name,
|
208
208
|
value_written: value_written,
|
209
|
-
value_read: value_read
|
209
|
+
value_read: value_read,
|
210
210
|
)
|
211
211
|
end
|
212
212
|
|
@@ -218,7 +218,7 @@ module Shoulda
|
|
218
218
|
AttributeDoesNotExistError.create(
|
219
219
|
model: object.class,
|
220
220
|
attribute_name: attribute_name,
|
221
|
-
value: value_written
|
221
|
+
value: value_written,
|
222
222
|
)
|
223
223
|
end
|
224
224
|
|
data/lib/shoulda/matchers/active_model/allow_value_matcher/attribute_setter_and_validator.rb
CHANGED
@@ -34,7 +34,7 @@ module Shoulda
|
|
34
34
|
attribute_name: attribute_name,
|
35
35
|
value: value,
|
36
36
|
ignore_interference_by_writer: ignore_interference_by_writer,
|
37
|
-
after_set_callback: after_setting_value_callback
|
37
|
+
after_set_callback: after_setting_value_callback,
|
38
38
|
)
|
39
39
|
end
|
40
40
|
|
@@ -48,7 +48,7 @@ module Shoulda
|
|
48
48
|
attribute_to_check_message_against,
|
49
49
|
context: context,
|
50
50
|
expects_strict: expects_strict?,
|
51
|
-
expected_message: expected_message
|
51
|
+
expected_message: expected_message,
|
52
52
|
)
|
53
53
|
end
|
54
54
|
|
@@ -10,49 +10,51 @@ module Shoulda
|
|
10
10
|
# include ActiveModel::Model
|
11
11
|
# include ActiveModel::SecurePassword
|
12
12
|
# attr_accessor :password
|
13
|
+
# attr_accessor :reset_password
|
13
14
|
#
|
14
15
|
# has_secure_password
|
16
|
+
# has_secure_password :reset_password
|
15
17
|
# end
|
16
18
|
#
|
17
19
|
# # RSpec
|
18
20
|
# RSpec.describe User, type: :model do
|
19
21
|
# it { should have_secure_password }
|
22
|
+
# it { should have_secure_password(:reset_password) }
|
20
23
|
# end
|
21
24
|
#
|
22
25
|
# # Minitest (Shoulda)
|
23
26
|
# class UserTest < ActiveSupport::TestCase
|
24
27
|
# should have_secure_password
|
28
|
+
# should have_secure_password(:reset_password)
|
25
29
|
# end
|
26
30
|
#
|
27
31
|
# @return [HaveSecurePasswordMatcher]
|
28
32
|
#
|
29
|
-
def have_secure_password
|
30
|
-
HaveSecurePasswordMatcher.new
|
33
|
+
def have_secure_password(attr = :password)
|
34
|
+
HaveSecurePasswordMatcher.new(attr)
|
31
35
|
end
|
32
36
|
|
33
37
|
# @private
|
34
38
|
class HaveSecurePasswordMatcher
|
35
39
|
attr_reader :failure_message
|
36
40
|
|
37
|
-
CORRECT_PASSWORD =
|
38
|
-
INCORRECT_PASSWORD =
|
39
|
-
|
40
|
-
EXPECTED_METHODS = [
|
41
|
-
:authenticate,
|
42
|
-
:password=,
|
43
|
-
:password_confirmation=,
|
44
|
-
:password_digest,
|
45
|
-
:password_digest=,
|
46
|
-
]
|
41
|
+
CORRECT_PASSWORD = 'aBcDe12345'.freeze
|
42
|
+
INCORRECT_PASSWORD = 'password'.freeze
|
47
43
|
|
48
44
|
MESSAGES = {
|
49
|
-
authenticated_incorrect_password:
|
50
|
-
|
51
|
-
|
52
|
-
|
45
|
+
authenticated_incorrect_password: 'expected %{subject} to not'\
|
46
|
+
' authenticate an incorrect %{attribute}',
|
47
|
+
did_not_authenticate_correct_password: 'expected %{subject} to'\
|
48
|
+
' authenticate the correct %{attribute}',
|
49
|
+
method_not_found: 'expected %{subject} to respond to %{methods}',
|
50
|
+
}.freeze
|
51
|
+
|
52
|
+
def initialize(attribute)
|
53
|
+
@attribute = attribute.to_sym
|
54
|
+
end
|
53
55
|
|
54
56
|
def description
|
55
|
-
"have a secure password"
|
57
|
+
"have a secure password, defined on #{@attribute} attribute"
|
56
58
|
end
|
57
59
|
|
58
60
|
def matches?(subject)
|
@@ -60,7 +62,8 @@ module Shoulda
|
|
60
62
|
|
61
63
|
if failure = validate
|
62
64
|
key, params = failure
|
63
|
-
@failure_message =
|
65
|
+
@failure_message =
|
66
|
+
MESSAGES[key] % { subject: subject.class }.merge(params)
|
64
67
|
end
|
65
68
|
|
66
69
|
failure.nil?
|
@@ -71,21 +74,44 @@ module Shoulda
|
|
71
74
|
attr_reader :subject
|
72
75
|
|
73
76
|
def validate
|
74
|
-
missing_methods =
|
77
|
+
missing_methods = expected_methods.reject do |m|
|
78
|
+
subject.respond_to?(m)
|
79
|
+
end
|
75
80
|
|
76
81
|
if missing_methods.present?
|
77
82
|
[:method_not_found, { methods: missing_methods.to_sentence }]
|
78
83
|
else
|
79
|
-
subject.
|
80
|
-
subject.
|
84
|
+
subject.send("#{@attribute}=", CORRECT_PASSWORD)
|
85
|
+
subject.send("#{@attribute}_confirmation=", CORRECT_PASSWORD)
|
81
86
|
|
82
|
-
if not subject.
|
83
|
-
[:did_not_authenticate_correct_password,
|
84
|
-
|
85
|
-
|
87
|
+
if not subject.send(authenticate_method, CORRECT_PASSWORD)
|
88
|
+
[:did_not_authenticate_correct_password,
|
89
|
+
{ attribute: @attribute },]
|
90
|
+
elsif subject.send(authenticate_method, INCORRECT_PASSWORD)
|
91
|
+
[:authenticated_incorrect_password, { attribute: @attribute }]
|
86
92
|
end
|
87
93
|
end
|
88
94
|
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
def expected_methods
|
99
|
+
@_expected_methods ||= %I[
|
100
|
+
#{authenticate_method}
|
101
|
+
#{@attribute}=
|
102
|
+
#{@attribute}_confirmation=
|
103
|
+
#{@attribute}_digest
|
104
|
+
#{@attribute}_digest=
|
105
|
+
]
|
106
|
+
end
|
107
|
+
|
108
|
+
def authenticate_method
|
109
|
+
if @attribute == :password
|
110
|
+
:authenticate
|
111
|
+
else
|
112
|
+
"authenticate_#{@attribute}".to_sym
|
113
|
+
end
|
114
|
+
end
|
89
115
|
end
|
90
116
|
end
|
91
117
|
end
|
@@ -8,7 +8,7 @@ module Shoulda
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def format_validation_errors(errors)
|
11
|
-
list_items = errors.keys.map do |attribute|
|
11
|
+
list_items = errors.to_hash.keys.map do |attribute|
|
12
12
|
messages = errors[attribute]
|
13
13
|
"* #{attribute}: #{messages}"
|
14
14
|
end
|
@@ -26,7 +26,7 @@ module Shoulda
|
|
26
26
|
attribute.to_sym,
|
27
27
|
type,
|
28
28
|
model_name,
|
29
|
-
options
|
29
|
+
options,
|
30
30
|
)
|
31
31
|
end
|
32
32
|
end
|
@@ -3,11 +3,6 @@ module Shoulda
|
|
3
3
|
module ActiveModel
|
4
4
|
# @private
|
5
5
|
module NumericalityMatchers
|
6
|
-
autoload :ComparisonMatcher, 'shoulda/matchers/active_model/numericality_matchers/comparison_matcher'
|
7
|
-
autoload :EvenNumberMatcher, 'shoulda/matchers/active_model/numericality_matchers/even_number_matcher'
|
8
|
-
autoload :NumericTypeMatcher, 'shoulda/matchers/active_model/numericality_matchers/numeric_type_matcher'
|
9
|
-
autoload :OddNumberMatcher, 'shoulda/matchers/active_model/numericality_matchers/odd_number_matcher'
|
10
|
-
autoload :OnlyIntegerMatcher, 'shoulda/matchers/active_model/numericality_matchers/only_integer_matcher'
|
11
6
|
end
|
12
7
|
end
|
13
8
|
end
|
@@ -5,23 +5,42 @@ module Shoulda
|
|
5
5
|
# @private
|
6
6
|
class ComparisonMatcher < ValidationMatcher
|
7
7
|
ERROR_MESSAGES = {
|
8
|
-
:> =>
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
:> => {
|
9
|
+
label: :greater_than,
|
10
|
+
assertions: [false, false, true],
|
11
|
+
},
|
12
|
+
:>= => {
|
13
|
+
label: :greater_than_or_equal_to,
|
14
|
+
assertions: [false, true, true],
|
15
|
+
},
|
16
|
+
:< => {
|
17
|
+
label: :less_than,
|
18
|
+
assertions: [true, false, false],
|
19
|
+
},
|
20
|
+
:<= => {
|
21
|
+
label: :less_than_or_equal_to,
|
22
|
+
assertions: [true, true, false],
|
23
|
+
},
|
24
|
+
:== => {
|
25
|
+
label: :equal_to,
|
26
|
+
assertions: [false, true, false],
|
27
|
+
},
|
28
|
+
:!= => {
|
29
|
+
label: :other_than,
|
30
|
+
assertions: [true, false, true],
|
31
|
+
},
|
32
|
+
}.freeze
|
15
33
|
|
16
34
|
def initialize(numericality_matcher, value, operator)
|
17
35
|
super(nil)
|
18
36
|
unless numericality_matcher.respond_to? :diff_to_compare
|
19
37
|
raise ArgumentError, 'numericality_matcher is invalid'
|
20
38
|
end
|
39
|
+
|
21
40
|
@numericality_matcher = numericality_matcher
|
22
41
|
@value = value
|
23
42
|
@operator = operator
|
24
|
-
@message = ERROR_MESSAGES[operator]
|
43
|
+
@message = ERROR_MESSAGES[operator][:label]
|
25
44
|
end
|
26
45
|
|
27
46
|
def simple_description
|
@@ -94,10 +113,9 @@ module Shoulda
|
|
94
113
|
end
|
95
114
|
|
96
115
|
def submatchers_and_results
|
97
|
-
@_submatchers_and_results ||=
|
98
|
-
|
99
|
-
|
100
|
-
end
|
116
|
+
@_submatchers_and_results ||= submatchers.map do |matcher|
|
117
|
+
{ matcher: matcher, matched: matcher.matches?(@subject) }
|
118
|
+
end
|
101
119
|
end
|
102
120
|
|
103
121
|
def comparison_combos
|
@@ -115,20 +133,7 @@ module Shoulda
|
|
115
133
|
end
|
116
134
|
|
117
135
|
def assertions
|
118
|
-
|
119
|
-
when :>
|
120
|
-
[false, false, true]
|
121
|
-
when :>=
|
122
|
-
[false, true, true]
|
123
|
-
when :==
|
124
|
-
[false, true, false]
|
125
|
-
when :<
|
126
|
-
[true, false, false]
|
127
|
-
when :<=
|
128
|
-
[true, true, false]
|
129
|
-
when :!=
|
130
|
-
[true, false, true]
|
131
|
-
end
|
136
|
+
ERROR_MESSAGES[@operator][:assertions]
|
132
137
|
end
|
133
138
|
|
134
139
|
def diffs_to_compare
|
@@ -143,14 +148,7 @@ module Shoulda
|
|
143
148
|
end
|
144
149
|
|
145
150
|
def comparison_expectation
|
146
|
-
|
147
|
-
when :> then "greater than"
|
148
|
-
when :>= then "greater than or equal to"
|
149
|
-
when :== then "equal to"
|
150
|
-
when :< then "less than"
|
151
|
-
when :<= then "less than or equal to"
|
152
|
-
when :!= then 'other than'
|
153
|
-
end
|
151
|
+
ERROR_MESSAGES[@operator][:label].to_s.tr('_', ' ')
|
154
152
|
end
|
155
153
|
end
|
156
154
|
end
|
@@ -103,15 +103,17 @@ module Shoulda
|
|
103
103
|
if reflection
|
104
104
|
obj = reflection.klass.new
|
105
105
|
if collection?
|
106
|
-
[
|
106
|
+
[obj]
|
107
107
|
else
|
108
108
|
obj
|
109
109
|
end
|
110
|
+
elsif array_column?
|
111
|
+
['an arbitary value']
|
110
112
|
else
|
111
113
|
case column_type
|
112
114
|
when :integer, :float then 1
|
113
115
|
when :decimal then BigDecimal(1, 0)
|
114
|
-
when :datetime, :time, :timestamp then Time.
|
116
|
+
when :datetime, :time, :timestamp then Time.current
|
115
117
|
when :date then Date.new
|
116
118
|
when :binary then '0'
|
117
119
|
else 'an arbitrary value'
|
@@ -137,6 +139,12 @@ module Shoulda
|
|
137
139
|
@subject.class.respond_to?(:reflect_on_association) &&
|
138
140
|
@subject.class.reflect_on_association(@attribute)
|
139
141
|
end
|
142
|
+
|
143
|
+
def array_column?
|
144
|
+
@subject.class.respond_to?(:columns_hash) &&
|
145
|
+
@subject.class.columns_hash[@attribute.to_s].respond_to?(:array) &&
|
146
|
+
@subject.class.columns_hash[@attribute.to_s].array
|
147
|
+
end
|
140
148
|
end
|
141
149
|
end
|
142
150
|
end
|
@@ -148,12 +148,12 @@ module Shoulda
|
|
148
148
|
|
149
149
|
def qualify_matcher(matcher, confirmation_attribute_value)
|
150
150
|
matcher.values_to_preset = {
|
151
|
-
confirmation_attribute => confirmation_attribute_value
|
151
|
+
confirmation_attribute => confirmation_attribute_value,
|
152
152
|
}
|
153
153
|
matcher.with_message(
|
154
154
|
@expected_message,
|
155
155
|
against: confirmation_attribute,
|
156
|
-
values: { attribute: attribute }
|
156
|
+
values: { attribute: attribute },
|
157
157
|
)
|
158
158
|
end
|
159
159
|
end
|
@@ -146,11 +146,12 @@ module Shoulda
|
|
146
146
|
else
|
147
147
|
description = "validate that :#{@attribute}"
|
148
148
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
149
|
+
description <<
|
150
|
+
if @array.many?
|
151
|
+
" is neither #{inspected_array}"
|
152
|
+
else
|
153
|
+
" is not #{inspected_array}"
|
154
|
+
end
|
154
155
|
|
155
156
|
description
|
156
157
|
end
|
@@ -238,8 +239,8 @@ module Shoulda
|
|
238
239
|
|
239
240
|
def inspected_array
|
240
241
|
Shoulda::Matchers::Util.inspect_values(@array).to_sentence(
|
241
|
-
two_words_connector:
|
242
|
-
last_word_connector:
|
242
|
+
two_words_connector: ' nor ',
|
243
|
+
last_word_connector: ', nor ',
|
243
244
|
)
|
244
245
|
end
|
245
246
|
end
|