Aborting unit tests

A

Alex Young

Hi all,

I've come across this pattern a few times now, and I'm wondering what
the best approach is. Say I've got a class like this:

class A
def public_method
c(b(a))
end

private
def a
# a stuff
end

def b(foo)
# b stuff
end

def c(bar)
# c stuff
end
end

Now, in my unit tests, I'm fine with having separate tests for a, b and
c, but I still want to test public_method separately, to ensure that
they're strung together properly. However, often I can test before
calling it that, for instance, a precondition for b() isn't met, because
of breakage somewhere else in the codebase. In that case, I don't want
to log public_method as having failed - that's just noise, the fact that
I've got a failure will be logged when the test for b() itself fails.
I'd like to be able to write this in my test:

class ATest < Test::Unit::TestCase
def test_public_method
abort_if(!precondition_for_a ||
!precondition_for_b ||
!precondition_for_c)
assert(A.new.public_method, "It didn't work!")
end
end

I don't want to just wrap the assertion in a conditional, because then
it wouldn't be reported (and a reduced assertion count is too easy to
miss) - but I specifically don't want it reported as a failure.
Ideally, I'd like to see results like this:

$ ruby test/a_test.rb
Loaded suite test/a_test.rb
Started
# failure report here
.........a...a....F
Finished in 0.092032 seconds.

19 tests, 48 assertions, 1 failure, 0 errors, 2 aborts

Has anyone looked at this before? I can't see anything in the test/unit
docs that look relevant. Is it worth looking at, or is it just
indicative of some code that needs cleaning up on my part? If so, how
should it be fixed? As a concrete example, in Rails controller tests I
often find myself doing something like:

get :foo
assert_response :success
assert_not_nil assigns:)bar)

where if the assert_response :success fails, I know the reason will be
caught in a different test that checks the various error states, but
it's not worth checking assigns:)bar) in this test because it can't
possibly be valid.

Any hints gratefully received...
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,190
Members
46,740
Latest member
AdolphBig6

Latest Threads

Top