Daniel Berger wrote:
> Hi all,
>
> Ruby 1.8.x
>
> I've got a few tests where I'm looking for expected errors.  These are
> various system call errors.  The problem is that the exact Errno is
> different from platform to platform, so I end up writing stuff like
> this:
>
> assert_raises(Errno::EACCES, Errno::ENOTEMPTY){ Dir.unlink('some_dir')
> }
>
> This isn't very robust, since a new platform might fail with a
> different kind of Errno.  What I would like is a way to have this test
> succeed:
>
> assert_raises(SystemCallError){ Dir.unlink('some_dir') }
>
> The problem is that assert_raises looks for a specific error class.  Is
> there a way to tell TestUnit to expect any error that's a subclass of
> SystemCallError?
>
> Thanks,
>
> Dan
>
> PS - I see from the documentation that assert_raise is deprecated in
> 1.9.  What's replacing it?

The simplest way to do this which comes to my mind is to use the fact that the 
exceptions you need are the only constants in the Errno module. This allows 
you to write

  assert_raise(*(Errno.constants.map{|c| Errno.const_get(c)}))
{Dir.unlink('some_dir')}

Errno.constants gives you an array with the names of the constants, which are 
the names of the exception claesses you're interested in. The map method 
transforms the array of names in an  array of classes, obtained using 
Errno.const_get

As for assert_raises being deprecated, I think it's simply a matter of names, 
since the method replacing it is simply assert_raise (without the final s).

I hope this helps

Stefano