rspec/rspec-rails

Rails 7.1 raise WrongScopeError on take_failed_screenshot

senid231 opened this issue · 3 comments

I see the additional error WrongScopeError: metadata is not available from within an example when the system test failed

What Ruby, Rails and RSpec versions are you using?

ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux]
Rails 7.1.1
RSpec 3.12
  - rspec-core 3.12.2
  - rspec-expectations 3.12.3
  - rspec-mocks 3.12.5
  - rspec-rails 6.0.3
  - rspec-support 3.12.0

Observed behaviour

4.2) Failure/Error:
            raise WrongScopeError,
                  "`#{name}` is not available from within an example (e.g. an " \
                  "`it` block) or from constructs that run in the scope of an " \
                  "example (e.g. `before`, `let`, etc). It is only available " \
                  "on an example group (e.g. a `describe` or `context` block)."

            `metadata` is not available from within an example (e.g. an `it` block) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc). It is only available on an example group (e.g. a `describe` or `context` block).

          [Screenshot Image]: /home/runner/work/senid231/test_project/tmp/capybara/....png

          [Screenshot HTML]: /home/runner/work/senid231/test_project/tmp/capybara/....html


          # /home/runner/work/senid231/test_project/vendor/bundle/ruby/3.2.0/gems/rspec-core-3.12.2/lib/rspec/core/example_group.rb:760:in `method_missing'
          # /home/runner/work/senid231/test_project/vendor/bundle/ruby/3.2.0/gems/activerecord-7.1.1/lib/active_record/test_fixtures.rb:278:in `method_missing'
          # /home/runner/work/senid231/test_project/vendor/bundle/ruby/3.2.0/gems/actionpack-7.1.1/lib/action_dispatch/testing/assertions/routing.rb:195:in `method_missing'
          # /home/runner/work/senid231/test_project/vendor/bundle/ruby/3.2.0/gems/actionpack-7.1.1/lib/action_dispatch/testing/integration.rb:440:in `method_missing'
          # /home/runner/work/senid231/test_project/vendor/bundle/ruby/3.2.0/gems/actionpack-7.1.1/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb:48:in `take_failed_screenshot'
          # /home/runner/work/senid231/test_project/vendor/bundle/ruby/3.2.0/gems/actionpack-7.1.1/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb:8:in `before_teardown'
          # /home/runner/work/senid231/test_project/vendor/bundle/ruby/3.2.0/gems/rspec-rails-6.0.3/lib/rspec/rails/example/system_example_group.rb:110:in `call'
          # /home/runner/work/senid231/test_project/vendor/bundle/ruby/3.2.0/gems/rspec-rails-6.0.3/lib/rspec/rails/example/system_example_group.rb:110:in `block (2 levels) in <module:SystemExampleGroup>'

broken due to changes in ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper#take_failed_screenshot added here

        def take_failed_screenshot
          return unless failed? && supports_screenshot? && Capybara::Session.instance_created?

          take_screenshot
          metadata[:failure_screenshot_path] = relative_image_path if Minitest::Runnable.method_defined?(:metadata)
        end

Expected behaviour

No additional exception

Can you provide an example app?

reproduces on any failed system test with rails 7.1

temporary fix:

spec/rspec_screenshot_helper_patch.rb

module RspecScreenshotHelperPatch
  def take_failed_screenshot
    return unless failed? && supports_screenshot? && Capybara::Session.instance_created?

    take_screenshot
  end
end

spec/rails_helper.rb

require_relative 'rspec_screenshot_helper_patch'
# ...
RSpec.configure do |config|
  # ...
  config.include RspecScreenshotHelperPatch, type: :system
end
pirj commented

Same as #2690? Do you want to contribute a fix? Does #2704 fix the issue for you?

thanks @pirj

yes, looks like my issues same as #2690, will close this one