Skip to content

Instantly share code, notes, and snippets.

@tomoasleep
Last active July 3, 2023 00:18
Show Gist options
  • Save tomoasleep/64d559b8be22a32b1a5d7d97f02a51ed to your computer and use it in GitHub Desktop.
Save tomoasleep/64d559b8be22a32b1a5d7d97f02a51ed to your computer and use it in GitHub Desktop.
Launch postmortem debug on test failure
require 'debug'
module DebugHelper
class << self
def debug_on_error
yield
rescue => e
enter_postmortem_session(e)
raise e
end
def enter_postmortem_session(error)
error = error.cause while error.cause
puts "Enter postmortem mode with #{error.inspect}"
puts error.backtrace.map { |b| "\t#{b}" }
puts "\n"
DEBUGGER__::SESSION.enter_postmortem_session(error)
end
def enable!
DEBUGGER__::SESSION.postmortem = true
end
end
end
if ENV['DEBUG_ON_ERROR']
DebugHelper.enable!
RSpec.configure do |c|
c.around(:each) do |example|
DebugHelper.debug_on_error do
example.run
end
end
c.after(:each) do |example|
DebugHelper.enter_postmortem_session(example.exception) if example.exception
end
end
end
# USAGE: DEBUG_ON_ERROR=t ruby rspec_inline.rb
require 'bundler/inline'
gemfile do
gem 'rspec'
gem 'debug'
end
require_relative 'debug_helper'
RSpec.describe 'rspec-debug-on-error' do
it 'raises exception' do
1.undefined_method
end
it 'fails' do
expect(true).to be false
end
end
RSpec::Core::Runner.invoke
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment