assert_difference can take a callable piece of code rather than just evaling a string

This commit is contained in:
Aaron Patterson
2011-05-01 11:55:13 -07:00
parent 1800a6d1c8
commit 23eb81a3d1
2 changed files with 19 additions and 8 deletions

View File

@@ -576,11 +576,11 @@ class BelongsToAssociationsTest < ActiveRecord::TestCase
end
def test_polymorphic_counter_cache
tagging = taggings(:welcome_general)
post = post = posts(:welcome)
comment = comments(:greetings)
tagging = taggings(:welcome_general)
post = posts(:welcome)
comment = comments(:greetings)
assert_difference 'post.reload.taggings_count', -1 do
assert_difference lambda { post.reload.taggings_count }, -1 do
assert_difference 'comment.reload.taggings_count', +1 do
tagging.taggable = comment
end

View File

@@ -29,6 +29,16 @@ module ActiveSupport
# post :create, :article => {...}
# end
#
# A lambda or a list of lambdas can be passed in and evaluated:
#
# assert_difference lambda { Article.count }, 2 do
# post :create, :article => {...}
# end
#
# assert_difference [->{ Article.count }, ->{ Post.count }], 2 do
# post :create, :article => {...}
# end
#
# A error message can be specified.
#
# assert_difference 'Article.count', -1, "An Article should be destroyed" do
@@ -37,14 +47,15 @@ module ActiveSupport
def assert_difference(expression, difference = 1, message = nil, &block)
b = block.send(:binding)
exps = Array.wrap(expression)
before = exps.map { |e| eval(e, b) }
before = exps.map { |e| e.respond_to?(:call) ? e.call : eval(e, b) }
yield
exps.each_with_index do |e, i|
error = "#{e.inspect} didn't change by #{difference}"
error = "#{message}.\n#{error}" if message
assert_equal(before[i] + difference, eval(e, b), error)
error = "#{e.inspect} didn't change by #{difference}"
error = "#{message}.\n#{error}" if message
actual = e.respond_to?(:call) ? e.call : eval(e, b)
assert_equal(before[i] + difference, actual, error)
end
end