From: "David A. Black" Date: 2005-04-14T10:09:52+09:00 Subject: Re: Mocking out a class object Hi -- On Thu, 14 Apr 2005, Avdi Grimm wrote: > > 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'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're actually dealing with two classes: MyMockClass, and MyMockClass's singleton class. So you would probably want to do something like this: # This is to make it look nicer (as per the # pending RCR :-) module Kernel def singleton_class class << self; self; end end end my_instance = "" MyMockClass = Class.new { self::FOO = "some value" singleton_class.class_eval { define_method(:new) {|*| my_instance} } } p MyMockClass::FOO # "some value" p MyMockClass.new # "" David -- David A. Black dblack@wobblini.net