Thanks, Myron!

I went about implementing the tracking within a formatter. Looks to be 
working great.

Will probably shortly refactor to remove the use of the global variable, 
but here's a snippet of code for any future onlookers:

require 'rspec/core/formatters/base_formatter'

$read_timeout_count = 0 # Used to track Net::ReadTimeout Exceptions

module RSpec
  module Stats
    class Formatter < RSpec::Core::Formatters::BaseFormatter

      def example_failed(notification)
        if notification.exception.to_s.include?('Net::ReadTimeout')
          $read_timeout_count += 1
        end
      end

    end
  end
end

Within dump_summary, I then gauge $read_timeout_count to Statsd.

On Wednesday, July 22, 2015 at 7:29:47 PM UTC-7, Myron Marston wrote:
>
> Rescuing exceptions in an around hook won’t work because within 
> example.run RSpec rescues the exception as part of tracking the example 
> state, notifying formatters, etc.
>
> Are you looking to track *all* raised exceptions (even if something 
> rescues them and/or retries)? Or just all the example failure exceptions?
>
> If you’re looking for the former, you’ll probably have to monkey patch 
> Kernel#raise or use a tracepoint 
> <http://ruby-doc.org/core-2.2.0/TracePoint.html>.
>
> If you’re looking for the latter, you can implement a listener/formatter 
> that registers the :example_failed event with RSpec so that it is 
> notified every time an example fails, and then you can do whatever you want 
> when notified.
>
> HTH,
> Myron
> ​
>
> On Wed, Jul 22, 2015 at 7:20 PM, Dylan Reichstadt <[email protected] 
> <javascript:>> wrote:
>
>> Hey Jon,
>>
>> Pretty solid idea! I didn't think of this.
>>
>> Unfortunately it doesn't look to catch the exception though. Tested 
>> with RSpec::Expectations::ExpectationNotMetError
>>
>> This was a snippet of my code (which never printed 'In here!' when the 
>> exception was raised - I tried simply rescue Exception as well):
>>
>> RSpec.configure do |config|
>>   config.around(:each) do |example|
>>     begin
>>       example.run
>>     rescue RSpec::Expectations::ExpectationNotMetError
>>       puts 'In here!'
>>       raise
>>     end
>>   end
>> end
>>
>>
>>
>>
>>
>> On Wednesday, July 22, 2015 at 6:11:44 PM UTC-7, Jon Rowe wrote:
>>>
>>> Not specifically, but you can configure an around hook to do what you 
>>> want:
>>>
>>> Rspec.configure do |config|
>>>   config.around(:example) do |example|
>>>     begin
>>>       example.run
>>>     rescue Net::ReadTimeout
>>>       # … your code
>>>       raise
>>>     end
>>>   end
>>> end
>>>
>>> Jon Rowe
>>> ---------------------------
>>> [email protected]
>>> jonrowe.co.uk
>>>
>>> On Thursday, 23 July 2015 at 11:06, Dylan Reichstadt wrote:
>>>
>>> Hey All,
>>>
>>> I am looking to add better instrumentation around exceptions thrown in 
>>> rspec. For example, I want to track how many times I get a Net::ReadTimeout 
>>> error from Capybara/Rspec.
>>>
>>> In a limited scope, I have been:
>>>
>>>    - Rescuing this exception
>>>    - Incrementing a global variable
>>>    - Re-raising that exception again (after incrementing)
>>>    
>>>
>>> However, this exception can happen across all examples. I don't want to 
>>> wrap every scenario in a Begin & Rescue block - that sounds extremely messy.
>>>
>>> Does rspec have something to help with this, or does anyone have any 
>>> ideas I can achieve better tracking of exceptions? I have been googling 
>>> around RSpec and Catching All Exceptions, but can't find anything.
>>>
>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "rspec" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to [email protected].
>>> To post to this group, send email to [email protected].
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/rspec/88d51b4d-2bb3-4391-bffd-476663474a07%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/rspec/88d51b4d-2bb3-4391-bffd-476663474a07%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>>
>>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "rspec" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to [email protected] <javascript:>.
>> To post to this group, send email to [email protected] <javascript:>
>> .
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/rspec/ad47b93c-b440-4591-9af5-98f49b0aad1f%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/rspec/ad47b93c-b440-4591-9af5-98f49b0aad1f%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rspec/4a86957d-55af-4dec-88a9-0ebe1c079318%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to