[rspec-users] Continuing a "specify" block after failure

David Chelimsky dchelimsky at gmail.com
Mon Feb 26 15:22:20 EST 2007


On 2/26/07, leenoori <leenoori at quepica.com> wrote:
> I have some high-level acceptance tests that read a bunch of files,
> process them, and then confirm that the processed output matches the
> expected output. That is, for each file "a.input" I have a
> corresponding file "a.expected" and I basically want to churn through
> all of them producing "a.processed" and making sure that
> "a.processed" equals "a.expected"
>
> The way I currently have this is:
>
> context 'transforming files' do
>    specify 'actual output should match expected output' do
>      @files.each do |file|
>        file.input.process.should == file.expected
>      end
>    end
> end
>
> The problem with this is that a failure on one file prevents all the
> others from being tested. What would be the "best practice" way to
> overcome this shortcoming?
>
> The solution I used with Test::Unit was to add an "ErrorCollector" as
> described here:
>
> http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/138320
>
> Basically it catches exceptions as they are raised, sending messages
> to the Test::Unit machinery so that the problems can be counted and
> reported, but continues processing.
>
> Would a similar technique be a good idea for RSpec? Or should I just
> restructure my specs? By that I mean something like the following
> (although not sure if it will work):
>
> context 'transforming files' do
>    files.each do |file|
>      specify 'actual output should match expected output' do
>        file.input.process.should == file.expected
>      end
>    end
> end

IMO, since statements about each file could fail independently, then
each file wants its own specify block. So I would do it this way, with
the addition of something to separate out the spec names. For example
(possibly to verbose, but you get the idea):

context 'transforming files' do
  files.each do |file|
    specify "actual output should match expected output (#{file.inspect})" do
      file.input.process.should == file.expected
    end
  end
end

Cheers,
David

>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>


More information about the rspec-users mailing list