Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master
Fetching contributors…

Cannot retrieve contributors at this time

78 lines (59 sloc) 2.504 kb
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.
Jump to Line
Something went wrong with that request. Please try again.