[rspec-users] Mocking expectations on I/O operations

Justin Ko
2011-09-15T11:35:16Z

On Thu, Sep 15, 2011 at 5:05 AM, Rob Aldred <rob at stardotstar.com>
wrote:

> Thanks Justin,
> That isnt working... its erroring with:
>
> The method `delete` was not stubbed or was already unstubbed
>

Woops, you''re using expectations, not stubs. Try `File.rspec_reset`


>
> --
> Rob Aldred
>
> Software Developer
> rob at stardotstar.com
> twitter: stardotstar
>
> 47 Newton Street, Manchester, M1 1FT
> T: +44 (0) 161 236 9740
> ___________________________________________________
>
> This email and any files or ideas transmitted within it are sent in
> confidence and are intended solely for the use of the individual or
> entity to whom they are addressed. If you have received this email
> in error please notify the system manager at info at stardotstar.com
>
> On Thursday, 15 September 2011 at 01:52, Justin Ko wrote:
>
> >
> >
> > On Wed, Sep 14, 2011 at 6:51 AM, Rob Aldred <rob at
stardotstar.com(mailto:
> rob at stardotstar.com)> wrote:
> > >  I''m speccing a small lib which manipulates image files
using
> mini_magick.
> > >  The lib creates various temporary files during the process, the
lib
> then cleans up the temporary files at the end.
> > >
> > >  I''m trying to mock expectations that the calls are made
to File#delete
> > >
> > >  Eg...
> > >
>
File.should_receive(:delete).once.with("#{generator.tmp_path}-full\.png")
> > >
>
File.should_receive(:delete).once.with("#{generator.tmp_path}-screen\.png")
> > >
>
File.should_receive(:delete).once.with("#{generator.tmp_path}-shadow\.png")
> > >
> > >  The method in the lib that does this is:
> > >
> > >  Class IconGenerator
> > >  ...
> > >
> > > private
> > >
> > > def cleanup
> > > # remove temporary files created during
> > > # image manipulation
> > >
[''-full'',''_screen'',''_shadow'',''_back_shadow''].each
do |f|
> > > File.delete "#{tmp_path}#{f}.png" if File.exists?
"#{tmp_path}#{f}.png"
> > > end
> > > end
> > >  ...
> > >  end
> > >
> > >  The expectations work fine, however, I also have an after block
which
> also calls File.delete to clean up the final version of the manipulated
test
> image
> > >
> > >  after(:each) do
> > > # cleanup manipulated image
> > > File.delete out_dir.join(''MenuIcon.png'') if
File.exists?
> out_dir.join(''MenuIcon.png'')
> > > end
> > >
> > >  The File.delete call in the after block fails because its
calling the
> mocked version of File.delete
> > >  This results in the following error:
> > >
> > >  Failure/Error: File.delete
out_dir.join(''MenuIcon.png'') if
> File.exists? out_dir.join(''MenuIcon.png'')
> > >  NoMethodError:
> > >  undefined method `=~'' for
> #<Pathname:/Users/robaldred/Sites/egg/tmp/MenuIcon.png>
> > >
> > >
> > >  My next step was to stub the write method for every instance of
> MiniMagick::Image
> > >  However I will then no longer be able to test the cleanup
because the
> delete method will never be called if the files don''t exist.
> > >
> > >  I''m pretty sure I''m going about this the wrong
way and making it
> difficult for myself here.
> > >  Appreciate any help & feedback
> > >
> > >  Thanks
> > > --
> > >  Rob
> > >
> > >  _______________________________________________
> > >  rspec-users mailing list
> > > rspec-users at rubyforge.org (mailto:rspec-users at
rubyforge.org)
> > > http://rubyforge.org/mailman/listinfo/rspec-users
> >
> > Give `File.unstub(:delete)` in your `after` block.
> >
> > Attachments:
> > - ATT00001..txt
> >
>
>
>
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://rubyforge.org/pipermail/rspec-users/attachments/20110915/28e8a9ba/attachment-0001.html>