From: Daniel Berger Date: 2006-11-25T09:30:08+09:00 Subject: Re: Generic way to test for expected SystemCallError 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