Skip to content

Commit

Permalink
Support refering to factory based on class name
Browse files Browse the repository at this point in the history
Allows for build/creating based on RSpec's described_class, useful since
we've deprecated other syntaxes from FG.

Closes thoughtbot#386
  • Loading branch information
joshuaclayton committed Jun 9, 2012
1 parent e8d32b9 commit f83c27e
Show file tree
Hide file tree
Showing 5 changed files with 62 additions and 4 deletions.
1 change: 1 addition & 0 deletions lib/factory_girl.rb
Expand Up @@ -38,6 +38,7 @@
require 'factory_girl/reload'
require 'factory_girl/decorator'
require 'factory_girl/decorator/attribute_hash'
require 'factory_girl/decorator/class_key_hash'
require 'factory_girl/decorator/disallows_duplicates_registry'
require 'factory_girl/decorator/invocation_tracker'
require 'factory_girl/decorator/invocation_ignorer'
Expand Down
27 changes: 27 additions & 0 deletions lib/factory_girl/decorator/class_key_hash.rb
@@ -0,0 +1,27 @@
module FactoryGirl
class Decorator
class ClassKeyHash < Decorator
def [](key)
@component[symbolized_key key]
end

def []=(key, value)
@component[symbolized_key key] = value
end

def key?(key)
@component.key? symbolized_key(key)
end

private

def symbolized_key(key)
if key.respond_to?(:to_sym)
key.to_sym
else
key.to_s.underscore.to_sym
end
end
end
end
end
8 changes: 4 additions & 4 deletions lib/factory_girl/registry.rb
Expand Up @@ -6,7 +6,7 @@ class Registry

def initialize(name)
@name = name
@items = {}
@items = Decorator::ClassKeyHash.new({})
end

def clear
Expand All @@ -19,7 +19,7 @@ def each(&block)

def find(name)
if registered?(name)
@items[name.to_sym]
@items[name]
else
raise ArgumentError, "#{@name} not registered: #{name}"
end
Expand All @@ -28,11 +28,11 @@ def find(name)
alias :[] :find

def register(name, item)
@items[name.to_sym] = item
@items[name] = item
end

def registered?(name)
@items.key?(name.to_sym)
@items.key?(name)
end
end
end
22 changes: 22 additions & 0 deletions spec/acceptance/keyed_by_class_spec.rb
@@ -0,0 +1,22 @@
require 'spec_helper'

describe 'finding factories keyed by class instead of symbol' do
before do
define_model("User") do
attr_accessor :name, :email
end

FactoryGirl.define do
factory :user do
name 'John Doe'
sequence(:email) {|n| "person#{n}@example.com" }
end
end
end

it 'allows interaction based on class name' do
user = FactoryGirl.create User, email: 'person@example.com'
user.email.should == 'person@example.com'
user.name.should == 'John Doe'
end
end
8 changes: 8 additions & 0 deletions spec/factory_girl/registry_spec.rb
Expand Up @@ -57,4 +57,12 @@
subject.clear
subject.count.should be_zero
end

it "registers classes" do
define_class("User")
subject.register(User, registered_object)
subject.to_a.should == [registered_object]
subject.find(:user).should == registered_object
subject.find(User).should == registered_object
end
end

0 comments on commit f83c27e

Please sign in to comment.