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

Justin Ko jko170 at gmail.com
Wed Sep 14 20:52:37 EDT 2011


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>


More information about the rspec-users mailing list