Rails载波测试 - 如何在测试后删除文件?

时间:2012-09-10 12:48:22

标签: ruby-on-rails rspec capybara carrierwave

我正在使用rspec和capybara测试carrierwave上传功能。我有类似的东西:

describe "attachment" do
    let(:local_path)  { "my/file/path" }
    before do
      attach_file('Attachment file', local_path)
      click_button "Save changes"       
    end

    specify {user.attachment.should_not be_nil}
    it { should have_link('attachment', href: user.attachment_url) }
end

这很有效。问题是测试后上传的图像仍然在我的public / uploads目录中。测试完成后如何将其删除?我试过这样的事情:

after do
   user.remove_attachment!
end

但它不起作用。

4 个答案:

答案 0 :(得分:5)

您不是唯一一个在carrierwave中删除文件时遇到问题的人。

我最终做了:

user.remove_attachment = true
user.save

我得到了这个提示reading this

答案 1 :(得分:0)

哈!我今天找到了答案。

自动删除下载的文件是在after_commit挂钩中完成的。 这些在rails测试中默认不运行。我从来没有猜到过。

然而,这里的附言中没有记录: http://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html#method-i-after_commit

我通过深入了解载波代码来发现这一点 调试器,恰好在上面的评论中注意到了它 当我进入它时,源代码为after_commit。

谢天谢地ruby库在运行时没有像JS一样被剥夺注释。 ;)

文档中建议的解决方法是包含' test_after_commit' Gemfile中的gem,但仅限于测试环境。

的Gemfile:

...
gem 'test_after_commit', :group => :test
...

当我这样做时,它完全解决了我的问题。

现在,我的破坏后破坏声明通过了。

答案 2 :(得分:0)

此技术的latest CarrierWave documentation如下:

config.after(:suite) do
  if Rails.env.test? 
    FileUtils.rm_rf(Dir["#{Rails.root}/spec/support/uploads"])
  end 
end

请注意,上述内容只是假设您使用spec/support/uploads/进行图片处理,并且您不介意删除该目录中的所有内容。如果每个上传器有不同的位置,您可能希望直接从(工厂)模型派生上载和缓存目录:

config.after(:suite) do
  # Get rid of the linked images
  if Rails.env.test? || Rails.env.cucumber?
    tmp = Factory(:brand)
    store_path = File.dirname(File.dirname(tmp.logo.url))
    temp_path = tmp.logo.cache_dir
    FileUtils.rm_rf(Dir["#{Rails.root}/public/#{store_path}/[^.]*"])
    FileUtils.rm_rf(Dir["#{temp_path}/[^.]*"])
  end
end

或者,如果要删除在初始化程序中设置的CarrierWave根目录下的所有内容,可以执行以下操作:

config.after(:suite) do
  # Get rid of the linked images
  if Rails.env.test? || Rails.env.cucumber?
    FileUtils.rm_rf(CarrierWave::Uploader::Base.root)
  end
end

答案 3 :(得分:0)

spec/support/carrierwave.rb中的以下内容似乎更适合我:

uploads_test_path = Rails.root.join('uploads_test')

CarrierWave.configure do |config|
  config.root = uploads_test_path
end

RSpec.configure do |config|
  config.after(:suite) do
    FileUtils.rm_rf(Dir[uploads_test_path])
  end
end

这将设置特定于测试环境的整个根文件夹,并在套件后将其全部删除,因此您不必分别担心store_dircache_dir