From: Robert Klemme Date: 2005-04-14T17:49:36+09:00 Subject: Re: Mocking out a class object "Avdi Grimm" schrieb im Newsbeitrag news:ur7hep6w5.fsf@raytheon.com... > > Okay, I'm trying to mock up a class object. It needs to do two > things: > > 1. Respond to #new with a object *I* provide, rather than a new > instance of the class; and > 2. Contain a constant, such that code containing 'MyMockClass::FOO' > will work. > > I can think of a naive implementation: > > class MyMockClass > FOO="some value" > def self.set_instance(inst) > @instance=inst > end > def self.new(*) > return @instance > end > end > > I'm wondering, though, is there a way to do this inline with > metaprogramming, and avoid defining the set_instance method? I've > tried something like this: > > my_instance=... > > Class.new :MyMockClass { > const_set :FOO, "some value" > define_method(:new) do |*| > return my_instance > end > } > > But that doesn't work, because the define_method is creating an > instance method, not a class method. I've also tried to use a regular > old object, instead of a class object, but then the constant (FOO) > doesn't work. Any ideas? You don't really need to make it so complicated IMHO: class MockClass def initialize(obj) @obj = obj end def new() @obj end end >> MockClass::Foo = MockClass.new "foo" => # >> MockClass::Foo.new => "foo" >> MockClass::Foo.new.object_id => 135024424 >> MockClass::Foo.new.object_id => 135024424 >> MockClass::Foo.new.object_id => 135024424 >> MockClass::Foo.new.object_id => 135024424 Alternative class MockClass def initialize(sym, obj) @obj = obj self.class.const_set sym, self end def new() @obj end end >> MockClass.new :Foo, "foo" => # >> MockClass::Foo.new => "foo" >> MockClass::Foo.new.object_id => 135016960 >> MockClass::Foo.new.object_id => 135016960 >> MockClass::Foo.new.object_id => 135016960 >> MockClass::Foo.new.object_id => 135016960 Kind regards robert