Replacement for ActiveRecord fixtures using an extremely flexible ruby-based approach.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
lib
spec
tasks
LICENSE
README
init.rb

README

model_stubbing
==============

Creates in-memory versions of models for testing.  This attempts to solve a
few problems with ActiveRecord Fixtures:

Speed - There's no hit to the database and no cleanup between tests.
Flexibility - You can define a global set of stubs, or define custom ones
  for specific tests/specs

A lot of these ideas were taken from various approaches to fixtures and mocking
that I've seen:

fixture scenarios (http://errtheblog.com/post/7708)
unit_record (http://www.dcmanges.com/blog/rails-unit-record-test-without-the-database)
Rspec and #mock_model

Exemplar (http://www.bofh.org.uk/articles/2007/08/05/doing-the-fixture-thing)
I actually saw Exemplar after I wrote the initial version, but they do seem similar.

I honestly don't know if this is a better way or anything, I'm just experimenting with
a different approach.  Oh, and apparently this is an implementation of the ObjectMother 
(http://www.martinfowler.com/bliki/ObjectMother.html) pattern?

  # test/unit example
  # test/unit support not fully implemented yet
  require 'model_stubbing'

  class FooTest < Test::Unit::TestCase
    define_models do
      time 2007, 6, 1
    
      model Role do
        stub :owner, :name => 'owner'
        stub :author, :name => 'author'
      end
    
      model User do
        stub :name => 'bob', :admin => false
        stub :admin, :admin => true # inherits from default fixture
        stub :author, :roles => [all_stubs(:author_role)]
        stub :owner, :roles => [all_stubs(:author_role), all_stubs(:owner_role)]
      end
    
      model Post do
        # uses admin user fixture above
        stub :title => 'initial', :user => all_stubs(:admin_user), 
          :published_at => current_time + 5.days
      end
    end
    
    def test_foo
      @user   = users(:default) # default user stub
      @admin  = users(:admin)
      @custom = users(:default, :age => 25) # custom attributes, 
                                            #but not equal to @user any more
                                            
      @post   = posts(:default)
      @post.user # equal to @admin above
      
      current_time # stubbed to be 6/1/2007 using mocha or rspec
    end
  end

  # rspec example
  require 'model_stubbing'

  describe Foo do
    ...
  end

TODO
====

* Support other mocking frameworks besides rspec and mocha?

* Support Sequel, DataMapper, etc?  I use AR, but I'm willing to abstract
  some of that out in case someone wants to support another ORM.