Method: ActiveSupport::Testing::Assertions#assert_difference
- Defined in:
- activesupport/lib/active_support/testing/assertions.rb
#assert_difference(expression, *args, &block) ⇒ Object
Test numeric difference between the return value of an expression as a result of what is evaluated in the yielded block.
assert_difference 'Article.count' do
post :create, params: { article: {...} }
end
An arbitrary expression is passed in and evaluated.
assert_difference 'Article.last.comments(:reload).size' do
post :create, params: { comment: {...} }
end
An arbitrary positive or negative difference can be specified. The default is 1
.
assert_difference 'Article.count', -1 do
post :delete, params: { id: ... }
end
An array of expressions can also be passed in and evaluated.
assert_difference [ 'Article.count', 'Post.count' ], 2 do
post :create, params: { article: {...} }
end
A hash of expressions/numeric differences can also be passed in and evaluated.
assert_difference ->{ Article.count } => 1, ->{ Notification.count } => 2 do
post :create, params: { article: {...} }
end
A lambda or a list of lambdas can be passed in and evaluated:
assert_difference ->{ Article.count }, 2 do
post :create, params: { article: {...} }
end
assert_difference [->{ Article.count }, ->{ Post.count }], 2 do
post :create, params: { article: {...} }
end
An error message can be specified.
assert_difference 'Article.count', -1, 'An Article should be destroyed' do
post :delete, params: { id: ... }
end
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'activesupport/lib/active_support/testing/assertions.rb', line 101 def assert_difference(expression, *args, &block) expressions = if expression.is_a?(Hash) = args[0] expression else difference = args[0] || 1 = args[1] Array(expression).index_with(difference) end exps = expressions.keys.map { |e| e.respond_to?(:call) ? e : lambda { eval(e, block.binding) } } before = exps.map(&:call) retval = _assert_nothing_raised_or_warn("assert_difference", &block) expressions.zip(exps, before) do |(code, diff), exp, before_value| actual = exp.call = -> do code_string = code.respond_to?(:call) ? _callable_to_source_string(code) : code error = "`#{code_string}` didn't change by #{diff}, but by #{actual - before_value}" error = "#{}.\n#{error}" if error end assert_equal(before_value + diff, actual, ) end retval end |