如何使用Rspec存根File对象

时间:2012-11-20 04:24:02

标签: ruby-on-rails rspec stub

我在规范中有以下内容:

before do 
  @item = Item.new( title: "Lorem ipsum", 
    image: File.new(Rails.root.join('app', 'assets', 'images', 'rails.png')))
end

关联的规范需要大约30秒才能运行,但是当我从哈希中删除image: File.new()时,我的测试运行时间不到1秒!

所以File.new()正在为我的规格添加一个加载,如果可能的话我想将其存根,但是当我尝试这个时:

image: File.stub(Rails.root.join('app', 'assets', 'images', 'rails.png'))) 

我在测试输出中看到以下错误:

 Failure/Error: image: File.stub(Rails.root.join('app', 'assets', 'images', 'rails.png'))) }
 NoMethodError:
   undefined method `to_sym' for #<Pathname:0xae767d8>

我很感激这里有任何建议。 FWIW,图像上传由回形针处理。

4 个答案:

答案 0 :(得分:4)

我会做这样的事情:

@item = Item.new( title: "Lorem ipsum")
file = double('file', :size => 0.5.megabytes, :content_type => 'png', :original_filename => 'rails')
@item.stub(image).and_return(file)

答案 1 :(得分:4)

答案 2 :(得分:1)

还可以像这样存根附件: 将其添加到spec / support

module PaperclipStub
  def stub_paperclip_attachment(model, attachment)
    model.any_instance.stub(attachment.to_sym).and_return File.join(Rails.root, 'spec', 'fixtures', 'file.png')
    model.any_instance.stub("#{attachment}_file_name".to_sym).and_return File.join(Rails.root, 'spec', 'fixtures', 'file.png')
  end
end

在spec_helper.rb

config.include PaperclipStub # Include custom paperclip_attachment stub

并在规格中使用它:

it "should be valid" do
    stub_paperclip_attachment(Image, :image)
    Image.new.should be_valid
  end

答案 3 :(得分:1)

对不起,这不是嘲笑文件。你想制作一个对象并将一个真实的文件附加到它 - 这不是模拟,这些解决方案都不会模拟文件对象。

您绝对应该使用gem来制作测试数据,例如factory girl railsfabrication

..当你做汤姆时,答案是最好的答案:使用fixture_file_upload