Hi,

I'm trying to use RSpec (latest version, 2.1.0) with MacRuby, but there seems 
to be information missing from the exception backtraces which makes it 
difficult to see where exactly specs fail.

Running a straightforward helloworld_spec.rb with a failing example for 
instance, shows a reference to the failing line (hello_world.greeting.should == 
"Hello World!") in MRI Ruby 1.9.2:

Failures:
  1) A new HelloWorld object should return the appropriate greeting
     Failure/Error: hello_world.greeting.should == "Hello World!"
     expected: "Hello World!",
          got: "Hello Earth!" (using ==)
     # ./Spec/helloworld_spec.rb:6:in `block (2 levels) in <top (required)>'

In MacRuby (0.7.1) however, RSpec displays a 'Failure/Error: Unable to find 
matching line from backtrace' instead, which makes sense with no traces present 
referring to the actual spec:

Failures:
  1) A new HelloWorld object should return the appropriate greeting
     Failure/Error: Unable to find matching line from backtrace
     expected: "Hello World!",
          got: "Hello Earth!" (using ==)
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:41:in
 `block'
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:39:in
 `block'
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:75:in
 `block'
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:74:in
 `with_pending_capture'
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:32:in
 `run:'
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/example_group.rb:260:in
 `block'
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/example_group.rb:257:in
 `run_examples:'
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/example_group.rb:222:in
 `run:'
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/command_line.rb:26:in
 `block'
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/command_line.rb:15:in
 `run:'
     # 
/usr/local/rvm/gems/macruby-0....@test/gems/rspec-core-2.1.0/lib/rspec/core/runner.rb:10:in
 `block'
'
Looking at the complete backtrace in MRI Ruby 1.9.2 shows there seems to be a 
lot of information missing from the MacRuby backtrace. Apart from missing 
information about the context of a block and other differences in descriptions, 
MacRuby doesn't seem to list any traces beyond the instance_eval. The RSpec 
source (example.rb) shows it indeed uses instance_eval to evaluate the example 
block. I checked the backtraces in the rescue clauses there, but they don't 
contain traces from any execution beyond the instance_eval call. Is loss of 
exception backtraces in instance_eval a known limitations of MacRuby? Are there 
any plans to improve backtraces?

Failures:
  1) A new HelloWorld object should return the appropriate greeting
     Failure/Error: hello_world.greeting.should == "Hello World!"
     expected: "Hello World!",
          got: "Hello Earth!" (using ==)
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-expectations-2.1.0/lib/rspec/expectations/fail_with.rb:29:in
 `fail_with'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-expectations-2.1.0/lib/rspec/matchers/operator_matcher.rb:48:in
 `fail_with_message'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-expectations-2.1.0/lib/rspec/matchers/operator_matcher.rb:70:in
 `__delegate_operator'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-expectations-2.1.0/lib/rspec/matchers/operator_matcher.rb:60:in
 `eval_match'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-expectations-2.1.0/lib/rspec/matchers/operator_matcher.rb:29:in
 `block in use_custom_matcher_or_delegate'
     # ./Spec/helloworld_spec.rb:6:in `block (2 levels) in <top (required)>'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:42:in
 `instance_eval'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:42:in
 `block (2 levels) in run'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:81:in
 `call'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:81:in
 `with_around_hooks'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:39:in
 `block in run'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:75:in
 `call'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:75:in
 `block in with_pending_capture'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:74:in
 `catch'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:74:in
 `with_pending_capture'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example.rb:38:in
 `run'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example_group.rb:261:in
 `block in run_examples'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example_group.rb:257:in
 `map'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example_group.rb:257:in
 `run_examples'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/example_group.rb:231:in
 `run'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/command_line.rb:27:in
 `block (2 levels) in run'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/command_line.rb:27:in
 `map'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/command_line.rb:27:in
 `block in run'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/reporter.rb:12:in
 `report'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/command_line.rb:24:in
 `run'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/runner.rb:55:in
 `run_in_process'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/runner.rb:46:in
 `run'
     # 
/usr/local/rvm/gems/ruby-1.9.2...@test/gems/rspec-core-2.1.0/lib/rspec/core/runner.rb:10:in
 `block in autorun'

Just for completeness' sake, this is the code from example.rb that runs the 
example:

begin
          unless pending
            with_pending_capture do
              with_around_hooks do
                begin
                  run_before_each
                  @example_group_instance.instance_eval(&@example_block)
                rescue Exception => e
                  set_exception(e)
                ensure
                  run_after_each
                end
              end
            end
          end
        rescue Exception => e
          set_exception(e)
        ensure
          @example_group_instance.example = nil
          assign_auto_description
        end

Thanks,

Martijn
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

Reply via email to