Ruby on rails 在验收测试中加快回形针的图像处理

Ruby on rails 在验收测试中加快回形针的图像处理,ruby-on-rails,performance,rspec,paperclip,capybara,Ruby On Rails,Performance,Rspec,Paperclip,Capybara,当运行capybara功能规范时,我可以看到许多缓慢的工厂通知,这些通知由factory\u girl填充。我认为,这些缓慢的工厂工作会使功能规格变慢,甚至连功能规格都是固有的缓慢规格。然后,我进行了一些检查,发现大多数工厂运转缓慢是由回形针引起的。我们这里有一个使用回形针的模型: FactoryGirl.define do factory :asset do image Rails.root.join('spec/fixtures/sample.jpg').open end e

当运行
capybara
功能规范时,我可以看到许多缓慢的工厂通知,这些通知由
factory\u girl
填充。我认为,这些缓慢的工厂工作会使功能规格变慢,甚至连功能规格都是固有的缓慢规格。然后,我进行了一些检查,发现大多数工厂运转缓慢是由回形针引起的。我们这里有一个使用回形针的模型:

FactoryGirl.define do
  factory :asset do
    image Rails.root.join('spec/fixtures/sample.jpg').open
  end
end

所以我想知道是否有一种类似于测试模式的方法可以让
回形针
加速测试。我这里有一个简单的解决方案:只需复制原始文件,而不是实际裁剪它。

您可以在工厂设置曲别针图像字段,这将导致曲别针甚至不尝试处理图像:

factory :asset do        
  # Set the image fields manually to avoid uploading / processing the image
  image_file_name { 'test.jpg' }
  image_content_type { 'image/jpeg' }
  image_file_size { 256 }
end

我找到了实现这一点的方法,请参见以下代码:

FactoryGirl.define do
  factory :asset do
    image_file_name { 'sample.jpg' }
    image_content_type 'image/jpeg'
    image_file_size 256

    after(:create) do |asset|
      image_file = Rails.root.join("spec/fixtures/#{asset.image_file_name}")

      # cp test image to direcotries
      [:original, :medium, :thumb].each do |size|
        dest_path = asset.image.path(size)
        `mkdir -p #{File.dirname(dest_path)}`
        `cp #{image_file} #{dest_path}`
      end
    end
  end
end

手动
cp
在创建挂钩后,将测试映像复制到工厂中的真实资产映像路径。它很有魅力。

谢谢你的帮助。这很好,但我需要上传路径中存在的真实图像,例如,
public/system/assets/images/000/000/001/medium/test.jpg
。如果请求图像时出现404,功能规范将失败。您可能仍然可以将图像文件名指向Rails.root.join('spec/fixtures/sample.jpg')。我需要所有原始、大、中、小图片也存在于它们的目录中。我认为这种方法不会生成这些文件。谢谢,您只需将我的测试速度提高100倍:)这只是给其他人的一个提示。我只能在(:build)回调之后使用
回调,但它没有访问id的权限。通过向id添加一个序列来修复此问题,如下所示:
序列(:id){| n | n}