I think there's a much easier way to make this work on 1.9.2:

``` ruby
# 192_example.rb
SomeError = Class.new(StandardError)

class MethodMissingRaiseOtherError
  def method_missing(*)
    raise SomeError
  end
end

class MethodMissingRaiseNoMethodError
  def method_missing(*)
    raise NoMethodError
  end
end

class ToStrRaiseNoMethodError
  def to_str
    raise NoMethodError
  end
end

def test(klass)
  raise klass.new
rescue => e
  puts "#{klass.name}: #{e.class.name}: #{e.message}"
end

test MethodMissingRaiseOtherError
test MethodMissingRaiseNoMethodError
test ToStrRaiseNoMethodError
```

```
➜  rspec-mocks git:(master) ✗ ruby -v
ruby 1.9.2p320 (2012-04-20 revision 35421) [x86_64-darwin12.4.0]
➜  rspec-mocks git:(master) ✗ ruby 192_example.rb
MethodMissingRaiseOtherError: SomeError: SomeError
MethodMissingRaiseNoMethodError: TypeError: exception class/object expected
ToStrRaiseNoMethodError: NoMethodError: NoMethodError
```

As you can see, when you raise `NoMethodError` for a `to_str` message it triggers the desired behavior as long as long as you do so from `method_missing` rather than from an explicit `to_str` method.  Thus, I think you can make this work by making `to_str` raise `NoMethodError` for 1.9.2.  Then there's no need for this kinda hacky work around.