Daniel Berger
11/25/2006 12:25:00 AM
Stefano Crocco wrote:
> 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
Ugly, but I guess it will have to do. I'll probably wrap that in its
own method. Perhaps I can convince Nathaniel to either add a
"assert_raise_kind_of" method, or allow assert_raise to take another
argument.
> 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).
Oh, I could have sworn they were both deprecated. Perhaps I was
looking at old docs. Disregard. I can't wait to go through all of my
tests and update those. Not.
Thanks,
Dan