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

Rob Aldred rob at stardotstar.com
Thu Sep 15 05:05:59 EDT 2011


Thanks Justin,
That isnt working... its erroring with:

The method `delete` was not stubbed or was already unstubbed

--
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
> 





More information about the rspec-users mailing list