Model userstamp

module ObjectStatistics
  def included(other)
    other.send(:belongs_to, :created_by, :class_name => "User",
:foreign_key =>"created_by")
    other.send(:belongs_to, :updated_by, :class_name => "User",
:foreign_key =>"updated_by")
  end
  ...
end

This will call the belongs_to method on the class that the module is
included in. You may need to fiddle with the syntax, can't test this
at the moment.

Cheers,
Max

Hi all,

I am trying to do a functional test on a controller that mixes in a module with an expensive method, but I would like to mock out that method for my testing purposes. I can't seem to do it. Here's what I have tried

def setup
  @controller = MyController.new
  klass = class << @controller; self; end
  klass.send(:undef_method, :something_expensive)
  klass.send(:define_method, :something_expensive, lambda {nil})
end

I have also tried to do the less idiomatic but more straightforward
def @controller.something_expensive; nil; end

but that didn't help, either. The undef_method fails because it can't find the method (I guess becaues it's actually defined in the module). The other way just silently fails to accomplish its objective. I've googled some but am somewhat perplexed. Ideas?

### this is what the controller looks like ###

class MyController
  include ModuleWithExpensiveMethod
end

module ModuleWithExpensiveMethod
  def something_expensive
  sleep(100)
  end
end

I’ve got a plugin which handles this very simply. You just add two columns to the table, created_by_id and updated_by_id, then declare:

class Person < ActiveRecord::Base
acts_as_monitored
end

And the fields will be updated accordingly. This is a slightly nicer solution as it allows you to include the associations with a find.

The plugin assumes the current user can be accessed through User.current (you can change this if you need).

http://svn.viney.net.nz/things/rails/plugins/acts_as_monitored

-Jonathan.

Both of these techniques work fine when I try your examples - are you sure your example illustrates the problem you are seeing?

A third way is like this…

def setup

@controller = MyController.new
class << @controller
undef something_expensive # not strictly necessary
def something_expensive; end
end
end

But if you are getting into mocking and stubbing, you might like to have a look at Mocha at
http://mocha.rubyforge.org
which can make your life a bit easier.