Rspec+GuardでCarrierwaveを使用していると一時的にハングアップする
rspecをguardで自動化して実行した際に、Carrierwaveを使用した処理の実行後にrubyプロセスのCPU使用率が数十秒100%近い状態になります。
- rails 4.2.0
- rspec 3.2.0
- guard 2.12.4
- guard-rspec 4.5.0
- carrierwave 0.10.0
- factory_girl 4.5.0
環境は上記の通りです。
通常のコマンドからrspecを実行するとrubyプロセスのCPUの使用率はすぐに終了します。
しかしguardを使用してspecファイルの変更を検出しての実行の際には数十秒間CPUが100%近くなり、処理が止まります(次の変更の検知・実行までタイムラグがある)。
概要は以下のとおりで、
user モデル
imageというattributeを持っており、mount_uploader :image, UserImageUploader
として設定。
carrierwave 設定
CarrierWave.configure do |config|
if Rails.env.production? || Rails.env.staging?
config.fog_credentials = { ### }
config.asset_host = Settings.asset_host
config.fog_public = true
config.fog_directory = Rails.application.secrets.IMAGE_BUCKET
config.storage :fog
else
config.storage :file
end
if Rails.env.test?
config.enable_processing = false
end
end
rspec テスト部分
describe 'PATCH #update_image' do
let!(:user_attributes) { attributes_for(:user_image) }
before { xhr :patch, :update_image, user: user_attributes }
it { expect(flash.now[:notice]).not_to be_nil }
it { expect(response).to render_template :update_image }
end
上記のitのexample部分が実行された際にCPUがハングアップします。
また、FactoryGirlは以下のように記述しており、Rack::Test::UploadedFile.new
をfixture_file_upload
やActionDispatch::Http::UploadedFile.new
で設定しても変わりありません。
Factorygirl設定
factory :user_image, class: 'User' do
image Rack::Test::UploadedFile.new(File.open(File.join(Rails.root, "/spec/assets/blank.png")), 'image/png')
end
Guardファイルの設定は以下のようになっています。spring
を使用していますが、springを使用しない場合も同様でした。
guard :rspec, cmd: 'spring rspec -f progress', all_on_start: false, all_after_pass: false do
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
end
factory_girlの設定で、imageの項目にnilを設定するとハングアップしないので、Carrierwaveの処理が原因だと思うのですが、何か対処の仕方やなどありましたらご教授ください。
ちなみに、uploadするファイル自体は小さな画像ファイルで、実際にアップロードして検証した画像ファイルなども試しました。