1

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

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

4 回答 4

5

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

我最终做了:

user.remove_attachment = true
user.save

读到这个提示。

于 2012-09-10T12:58:05.187 回答
3

似乎对我有用的更清洁的解决方案如下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_dir这会将整个根文件夹设置为特定于测试环境,并在套件之后将其全部删除,因此您不必cache_dir单独担心。

于 2018-08-11T17:47:08.493 回答
0

哈!我今天找到了这个问题的答案。

下载文件的自动删除是在 after_commit 挂钩中完成的。默认情况下,这些不会在 rails 测试中运行。我永远不会猜到这一点。

然而,它在这里的附注中被随意记录:http: //api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html#method-i-after_commit

我通过使用调试器深入研究载波代码发现了这一点,当我进入它时,恰好在 after_commit 源代码上方的注释中注意到它。

谢天谢地,ruby 库不会像 JS 那样在运行时去掉注释。;)

文档中建议的解决方法是在您的 Gemfile 中包含“test_after_commit” gem,但仅在测试环境中。

IE

宝石文件:

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

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

现在,我的清理通过后销毁断言。

于 2014-11-19T15:07:11.097 回答
0

该技术的最新 CarrierWave 文档如下:

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
于 2017-02-08T16:48:16.090 回答