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)
您的上传是存储在本地还是他们转向像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)
现在,验证一直在创建实例,访问属性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)
| 归档时间: |
|
| 查看次数: |
2087 次 |
| 最近记录: |