I like assert_difference. It does exactly what it says on the tin - and in a nice, rubyish way.
However, I noticed that you can't assert a difference in something that isn't numeric. You can assert that creating a Customer will change the Customer.count, but you can't assert that updating the customers name will actually change the customer's name. Or, conversely, that updating a customer's name with *bad* data *doesn't* change the customer's name.
In my mind, it shouldn't really matter if the thing doing the changing is an int or a string or some complicated object. If the changing-thing responds to "==", you should be able to check if it changed. As long as you don't actually care what the exact change is that occurred - just whether or not a change *has* occurred.
So I wrote one that did.
assert_any_difference/assert_not_any_difference
Example tests. Note that you can pass a whole array of tests. These should nest, just like assert_difference
should "not change anything if the account is active" do @cr = customer_records(:active) assert_not_any_difference ['@cr.customer_number', '@cr.is_active'] do assert @cr.register! end end should "update active status if registering a non active customer" do @cr = customer_records(:in_active) assert_not_any_difference ['@cr.customer_number'] do assert_any_difference ['@cr.is_active'] do assert @cr.register! end end assert @cr.active? end
And the assertions. You'll need to add these to test_helper.rb
def assert_any_difference(items, &block) actual_diff(false, items, &block) end def assert_not_any_difference(items, &block) actual_diff(true, items, &block) end def actual_diff(test_if_equal, items) # save the old values old_vals = {} items.each {|item| old_vals[item] = eval(item) } # run the block yield test_fn = test_if_equal ? :assert_equal : :assert_not_equal # check each one items.each do |item| new_val = eval(item) send(test_fn, old_vals[item], new_val, "should #{'not' if test_if_equal} have been a difference for #{item}, but had: #{new_val}") end end
No comments:
Post a Comment