使用文件上传测试真的很慢

Ale*_*ant 11 rspec ruby-on-rails carrierwave factory-bot

我刚刚将载波图像的验证添加到模型中,现在测试运行速度非常慢.我怎样才能加快这个过程?我觉得必须有更好的方法.


我一直在没有验证的情况下运行,并且过去能够在大约140秒内完成我的rspec测试,但是因为我现在验证了:display_pic我必须将实际文件上传添加到我的项目工厂.这已经增加到240秒!140已经在沉重的一面,这只是疯了.

这就是carrierwave github页面建议设置Factory Girl的方法:

FactoryGirl.define do
  factory :project do
    display_pic { File.open(File.join(Rails.root, 'spec', 'support', 'projects', 'display_pics', 'test.jpg')) }
  end
end
Run Code Online (Sandbox Code Playgroud)

我做了上面的test.jpg只是一个空文本文件,所以它本质上尽可能小.

我还遵循了carrierwave建议来设置测试:

CarrierWave.configure do |config|
  config.storage = :file
  config.enable_processing = false
end
Run Code Online (Sandbox Code Playgroud)

Wol*_*old 9

您的上传是存储在本地还是他们转向像S3这样的云服务?如果是后者,这可能会破坏你的测试性能.

对于测试,模拟任何外部依赖项总是好的做法.如果这是您的问题,您应该使用工具来模拟连接.我认为雾宝石内置了对此的支持.

更新:关于Jefferson Girao的答案,我使用了一个技巧来避免打开测试文件,而是使用StringIO来模拟测试文件以用于工厂目的.这样做效果更好,因为它避免了磁盘访问:

def test_file_stream(filename = 'test.jpg', mime_type='image/jpg', content = '')
  StringIO.new(content).tap do |s|
    s.content_type = mime_type
    s.original_filename = filename
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 这发生了(差异的140秒)b/c,因为工厂女孩懒洋洋地评价它以前从未执行过.现在,当您运行验证时,该属性将始终被激活. (3认同)

jef*_*rao 6

现在,验证一直在创建实例,访问属性display_pic,括号内的代码

{ File.open(File.join(Rails.root, 'spec', 'support', 'projects', 'display_pics', 'test.jpg')) } 
Run Code Online (Sandbox Code Playgroud)

将被执行(它被懒惰地执行).这导致时间上的差异.

避免这种情况的一个选项是为工厂定义设置to_create我不建议:

FactoryGirl.define do
  factory :project do
    display_pic { File.open(File.join(Rails.root, 'spec', 'support', 'projects', 'display_pics', 'test.jpg')) }

    to_create do |instance|
      instance.save!(:validate => false)
    end 
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 我宁愿不绕过验证.在回形针中你可以用一个字符串填充pic字段,我希望沿着那些线条做些什么. (2认同)