7959


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 設定

[code]

    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
    
[/code]

# rspec テスト部分

[code]

    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
    
[/code]

上記のitのexample部分が実行された際にCPUがハングアップします。  
また、FactoryGirlは以下のように記述しており、`Rack::Test::UploadedFile.new`を`fixture_file_upload`や`ActionDispatch::Http::UploadedFile.new`で設定しても変わりありません。

# Factorygirl設定

[code]

    factory :user_image, class: 'User' do
        image Rack::Test::UploadedFile.new(File.open(File.join(Rails.root, "/spec/assets/blank.png")), 'image/png')
      end
    
[/code]

Guardファイルの設定は以下のようになっています。`spring`を使用していますが、springを使用しない場合も同様でした。

[code]

    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
    
[/code]

factory_girlの設定で、imageの項目にnilを設定するとハングアップしないので、Carrierwaveの処理が原因だと思うのですが、何か対処の仕方やなどありましたらご教授ください。

ちなみに、uploadするファイル自体は小さな画像ファイルで、実際にアップロードして検証した画像ファイルなども試しました。


CC BY-SA 3.0
2015-03-13T02:47:11.773
7860
2015-03-16T03:54:58.787
512
question
ruby-on-rails rspec
Rspec+GuardでCarrierwaveを使用していると一時的にハングアップする


log/test.logを開いてうまくいく場合と、うまくいかない場合の差異をチェックしてみるといかがでしょうか？  
処理が終わらないということはおそらくどこかでログの出力が止まってるんじゃないかと予想します。（何か処理が無限ループしまくってる、という可能性もあるかも）

ログを見ても原因がよくわからない場合はとりあえずログの内容を追記してください。

あとはguardをデバッグモードで実行してみることでしょうか。  
`bundle exec guard -d` で実行すると、通常よりも細かい内容が出力されます。  
そこにも何かヒントが隠れているかもしれません。  
こちらも必要に応じて追記してください。


CC BY-SA 3.0
2015-03-14T21:14:09.153
7924
2015-03-15T01:01:58.040
2015-03-15T01:01:58.040
85
85
7860
answer


自己回答です。

`Guardfile`に以下のように`ignore`を記述すれば発生しなくなりました。

[code]

    ignore /public/
    
[/code]


CC BY-SA 3.0
2015-03-16T03:54:58.787
7959
2015-03-16T03:54:58.787
512
7860
answer