Robert Klemme
11/20/2007 9:49:00 AM
2007/11/20, weathercoach@gmail.com <weathercoach@gmail.com>:
> Hello.
> I've been grappling with unit testing for a couple weeks now. I'm
> a bourne shell scripter by day who is trying to expand my skill
> set. I currently have a ruby script which I'm trying to create some
> unit tests for. The unit tests have not been running and I've
> finally traced the problem to this method. Specifically the "exit"
> call. If I comment out the exit then my tests actually run.
>
> # Cleanup any transient files and directories and then exit
> def script_clean
> FileUtils.rm_rf(WORKDIR) if File.exists?(WORKDIR)
> # Everything is tidy we should leave
> exit
> end
>
> The above method is called in 2 different scenarios. The first case
> is during script execution if any Exceptions occur. Then the error
> message is printed and the script_clean method is called to ensure the
> process exits.
>
> Here is an example of where the method is called
>
> begin
> File.open(ADMIN_FILE, "w+") {|f| f << ADMIN_CONTENTS }
> rescue Exception => e
> puts e ; script_clean
> end
>
> Additionally if the script runs through to the end without
> encountering any errors then the last line is a call to the
> script_clean method
>
> script_clean
>
> My tests are not triggering any Exceptions so it appears to be the
> last line which calls "script_clean" to hamper any test execution.
> Explicitly exiting when an uncorrectable error has happened is
> something I commonly do in bourne shell scripts and it made sense to
> carry over the practice in ruby.
I disagree. Ruby and Bourne Shell are two completely different
languages. Especially shell does not have exception handling. I
would especially not exit from unit tests but raise an exception.
Even if you use exit you can make sure your cleanup code is run by
placing it in END or a global "ensure" clause:
10:46:02 /cygdrive/c/SCMws/RKlemme/OPSC_Gold_bas_dev_R1.1.5_s11_pp/bas
$ ruby -e 'END{puts 1}; exit 2'
1
10:46:05 /cygdrive/c/SCMws/RKlemme/OPSC_Gold_bas_dev_R1.1.5_s11_pp/bas
$ ruby -e 'begin; exit 2;ensure puts 1; end'
1
> Should I be terminating premature
> and normal script execution in some other fashion that is more
> compatible with test/unit.
Yes, raise an exception. Btw, exit does actually throw an exception
but maybe that's not caught by the test framework.
$ ruby -e 'begin; exit 2; rescue Exception => e; p e, e.class,
e.class.ancestors; end'
#<SystemExit: exit>
SystemExit
[SystemExit, Exception, Object, Kernel]
You usually do not want your complete test suite to terminate when a
single test fails.
Kind regards
robert
--
use.inject do |as, often| as.you_can - without end