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

Justin Ko
2011-09-15T00:52:37Z

On Wed, Sep 14, 2011 at 6:51 AM, Rob Aldred <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
> http://rubyforge.org/mailman/listinfo/rspec-users


Give `File.unstub(:delete)` in your `after` block.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://rubyforge.org/pipermail/rspec-users/attachments/20110914/32f93594/attachment.html>