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

Rob Aldred
2011-09-14T10:51:24Z

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