使用spork运行rspec时,Carrierwave store_dir未被修改

时间:2012-08-21 03:08:46

标签: ruby-on-rails rspec carrierwave spork

我已按照instructions on how to define a test-specific store directory for carrierwave uploads进行操作,建议打开CarrierWave::Uploader::Base课程并重新定义store_dircache_dir,如下所示:

if defined?(CarrierWave)
  CarrierWave::Uploader::Base.descendants.each do |klass|
    next if klass.anonymous?
    klass.class_eval do
      def cache_dir
        "#{Rails.root}/spec/support/uploads/tmp"
      end 

      def store_dir
        "#{Rails.root}/spec/support/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
      end 
    end 
  end
end

这就像一个魅力,除非我用spork运行rspec,然后它无法修改类,上传存储在默认位置。有没有人知道为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

正在处理我们项目的其他人通过在AvatarUploader行之前添加仅CarrierWave::Uploader::Base.descendants.each的行来解决此问题,如下所示:

if defined?(CarrierWave)
  AvatarUploader # load AvatarUploader class 
  CarrierWave::Uploader::Base.descendants.each do |klass|
  #...

不完全确定为什么会这样,但确实如此。

答案 1 :(得分:0)

对于来到这里的任何人来说,接受答案的补充很少:

如果在调用之前未加载上传器类 CarrierWave :: Uploader :: Base.descendants,它将返回空数组,所以要么像接受的答案那样指定每个上传器,要么你可以做这样的事情来要求所有的上传者让我们说rails uploaders文件夹

Dir["#{Rails.root}/app/uploaders/*.rb"].each {|file| require file}
CarrierWave::Uploader::Base.descendants.each do |klass|
#...