LoginSignup
3

More than 3 years have passed since last update.

Rails 6 + RSpec 3.7~でスクリーンショットが真っ白になる問題の要点とその解決法

Last updated at Posted at 2020-02-09

要点

  • RSpec3.7で追加されたSystemSpecはスクショを自動で保存してくれる機能がある
  • Rails6ではRSpec4系の使用が推奨されている
  • 解決方法はrails_helper.rbパッチをあてる
  • なぜ?を追ってみたけど、わからなかった
  • 他の理由で失敗するケースもある模様

System Specのスクリーンショット保存機能

RSpec 3.7から追加された System Specでは、テスト失敗時に自動でスクリーンショットを保存してくれます。

この機能はRailsのシステムテストに組み込まれているので、feature specのようにcapybara-screenshotなどによるサポートを手動で設定する必要がありません。
Rails 5.1以降のシステムテストをRSpecで実行する(翻訳)|TechRacho

Rails6ではRSpec4の使用が推奨されている

rspec-railsのイシューにもおなじ問題が上がっていました。このスレッドで解決できる :thinking:?

Teardown hooks are called in the wrong order, resulting in a blank screenshot in Rails 6. · Issue #2153 · rspec/rspec-rails

とおもったのですが、「rspec-rails4.0で試してみてほしい」「完璧に動いたよ、サンキュー!」でおわっていました。Rails6にはRSpec4という組み合わせが推奨のようですね。

解決方法

以下の記事で、原因と解決するためのパッチが説明されていました。

rails 6.0.0 と rspec-rails 3.8.2 の組み合わせだと Capybara.reset_sessions! を呼んだ後に save_screenshot が呼ばれるので、スクリーンショットの内容が真っ白になります。
Rails アプリケーションの不安定なテストを撲滅したい 〜system spec のデバッグ方法とテストを不安定にさせる要因〜 - あらびき日記

rails_helper.rbにパッチをあてる

さきほどの記事にはパッチコードはあったのですが、「どこに書けばいいか」は明記されておらず、迷いました :sweat_drops:

rails_helper.rbに書いてあげると動作することがわかりました。

rails_helper.rb
module SystemHelper
  extend ActiveSupport::Concern

  included do |example_group|
    # Screenshots are not taken correctly
    # because RSpec::Rails::SystemExampleGroup calls after_teardown before before_teardown
    example_group.after do
      take_failed_screenshot
    end
  end

  def take_failed_screenshot
    return if @is_failed_screenshot_taken
    super
    @is_failed_screenshot_taken = true
  end
end

RSpec.configure do |config|
  config.include SystemHelper, type: :system
end

なぜ?を追ってみたが…

パッチコードをみたときに、「うーん :thinking: ?」何をしているのか、なぜ直るのかがわかりませんでした。「Capybara.reset_sessions! を呼んだ後に save_screenshot が呼ばれる」というキーワードでしらべてみました。

順序はただしいように見える
def before_teardown
  take_failed_screenshot
ensure
  super
end

def after_teardown
  Capybara.reset_sessions!
ensure
  super
end

TestHelpers::SetupAndTeardownモジュールにたどりついて、それでも :thinking:?で力尽きました(笑)

理由が気になる…。

まとめ

  • RSpec4はbetaだし、あげると既存のテストが壊れる可能性もある。
  • スクショが保存できればそれでいい。
  • RSpec4が来るまで動いてくれたらOK!
  • 上記にあてはまるようであれば、今回の対応でよいのではとおもいました。

他の理由で失敗するケースもある

遭遇はしたことないのですが、パスの長さがエラーの問題になるケースもあるようでした。(詳細未調査)

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
3