Hi, all!

I'm wondering how to test some monkey patching code. Take the standard
library 'jcode'
in Ruby 1.8 for example. It do some monkey patching for the core
String class when I
require it. If I want to write some unit-test or spec for it, how to
avoid it from affecting other
tests? In other words, how can I "uninstall" those monkey patching
after the test case
is finished or how can I constrain the monkey patching inside a ...,
say, namespace?

I tried the following code:


    orig_string = Object::String.clone

    $KCODE = 'u'
    require 'jcode'

    # do testings

    Object::String = orig_string

    str1 = "foo"
    str2 = String.new("foo")

    # jlength are monkey patching
    puts str1.jlength # => 3
    puts str2.jlength # => raise NoMethodError


As I expected, str2.jlength raises NoMethodError, but str1 which is
built
by a string literal, returned 3, still being patched.

Further more, when I type those code directly in IRB, the irb fire out
some exception and exited immediately:

C:/ruby/lib/ruby/1.8/irb/ruby-token.rb:101:in `Token': undefined
method `ancesto
rs' for "=":String (NoMethodError)
        from C:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:400:in `lex_init'
        from C:/ruby/lib/ruby/1.8/irb/slex.rb:237:in `call'
        from C:/ruby/lib/ruby/1.8/irb/slex.rb:237:in `match_io'
        from C:/ruby/lib/ruby/1.8/irb/slex.rb:222:in `match_io'
        from C:/ruby/lib/ruby/1.8/irb/slex.rb:76:in `match'
        from C:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:287:in `token'
        from C:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:263:in `lex'
        from C:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:234:in
`each_top_level_stateme
nt'
        from C:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:230:in `loop'
        from C:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:230:in
`each_top_level_stateme
nt'
        from C:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:229:in `catch'
        from C:/ruby/lib/ruby/1.8/irb/ruby-lex.rb:229:in
`each_top_level_stateme
nt'
        from C:/ruby/lib/ruby/1.8/irb.rb:146:in `eval_input'
        from C:/ruby/lib/ruby/1.8/irb.rb:70:in `start'
        from C:/ruby/lib/ruby/1.8/irb.rb:69:in `catch'
        from C:/ruby/lib/ruby/1.8/irb.rb:69:in `start'
        from C:/ruby/bin/irb:13

I suppose IRB itself is doing some monkey patching to String? So, is
there any
way to ..., return to my original question, to test monkey patching
code?

Thanks!