LoginSignup
7
3

More than 5 years have passed since last update.

RSpecでファイルがダウンロードされるまで待つ

Last updated at Posted at 2017-12-13

課題:ファイルのダウンロードが終わってたり終わってなかったり

Capybara(Chrome headless)のテストが不安定でした。

調査

ディレクトリの中が空じゃないかどうか見張ればいい。
なんでこんな単純なことに気づかなかったのか!!

実装

参考URLに載っているのとほぼ同じですが、PATHの指定を並列テストを考慮した作りにしています。

module WaitForDownload
  PATH = Rails.root.join("tmp/download#{ENV['TEST_ENV_NUMBER']}")

  def wait_for_download
    Timeout.timeout(Capybara.default_max_wait_time) do
      sleep(0.1) until downloaded?
    end
  end

  def downloads(pattern="*")
    Dir.glob(PATH.join(pattern))
  end

  def downloaded?
    !downloading? && downloads.any?
  end

  def downloading?
    downloads.grep(/\.crdownload\z/).any?
  end

  def clear_downloads
    FileUtils.rm_rf(downloads)
  end
end

RSpec.configure do |config|
  config.include WaitForDownload, type: :feature

  config.after :each, type: :feature do
    clear_downloads
  end
end

利用法

click_button 'Excelダウンロード'
wait_for_download
expect(downloads('*.xlsx').size).to eq 1

参考URL

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3