0.0
No commit activity in last 3 years
No release in over 3 years
Simple stubbed factories for Rspec
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 1.2.9
 Project Readme

stub_factory

This is just something I was working on for fun a while back and decided I'd push it to Github.

Rspec provides subject which will do most of what this code does. You probably want to use that instead.

Installation

gem install stub_factory

Or you can [fork and] clone the repo and install it using Jeweler's rake install task.

Usage

In your spec_helper

require 'stub_factory'
# Optionally include StubFactory

In your specs

factory(NextBigThing::Ninja::Foo)

describe 'awesomeness' do
  it 'should be easy' do
    foo(:stub => 'this').should be_a?(NextBigThing::Ninja::Foo)
  end
end

You can also specify the method name you want to use to access your instance

factory(NextBigThing::Ninja::Foo, :method_name => :ninja_foo)

describe 'awesomeness' do
  it 'should be easy' do
    # Then you can access your instance using your preferred method name
    ninja_foo(:stub => 'this').should be_a?(NextBigThing::Ninja::Foo)
  end
end

Check out stub_factory_spec.rb to see StubFactory in use.

Alternative Usage

If you already use FactoryGirl, as I do on a lot of my projects you may find the following method useful as it allows you to setup similar persistent instances of your Factories. Simple paste it in to your spec_helper.rb

def factory(factory_name, options = {})
  method_name = (options[:method_name] || factory_name).to_s.to_sym

  define_method(method_name) do |*args|
    var_name = "@#{method_name}"
    value    = instance_variable_get(var_name)
    return value if value

    attributes = args.shift || {}
    stubs      = args.shift || {}

    super_mock = Proc.new { |factory_name, attributes, stubs|
      Factory(factory_name, attributes).tap do |super_mock|
        super_mock.stub!(stubs)
      end
    }

    instance_variable_set(var_name, super_mock.call(factory_name, attributes, stubs))
  end
end

The difference being you pass the factory name to the factory method instead of a class and FactoryGirl does everything else.

factory(:post)

describe 'something' do
  it 'has attributes' do
    post(:published_at => Time.now)
  end
end

# calls Factory(:post, :published_at => Time.now)

Note on Patches/Pull Requests

  • Fork the project.
  • Make your feature addition or bug fix.
  • Add tests for it. This is important so I don't break it in a future version unintentionally.
  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
  • Send me a pull request. Bonus points for topic branches.

Copyright

Copyright (c) 2010 James Conroy-Finn. See LICENSE for details.