Add StaticRegistry decorator to mix in exceptions

This commit is contained in:
Joshua Clayton 2012-04-20 23:49:37 -04:00
parent eca2cbf2bc
commit 393b299a1f
5 changed files with 66 additions and 27 deletions

View File

@ -8,6 +8,7 @@ require "factory_girl/strategy/create"
require "factory_girl/strategy/attributes_for"
require "factory_girl/strategy/stub"
require "factory_girl/strategy/null"
require 'factory_girl/strict_registry'
require 'factory_girl/registry'
require 'factory_girl/null_factory'
require 'factory_girl/null_object'
@ -35,7 +36,7 @@ require 'factory_girl/version'
module FactoryGirl
def self.factories
@factories ||= Registry.new("Factory")
@factories ||= StrictRegistry.new(Registry.new("Factory"))
end
def self.register_factory(factory)
@ -50,7 +51,7 @@ module FactoryGirl
end
def self.sequences
@sequences ||= Registry.new("Sequence")
@sequences ||= StrictRegistry.new(Registry.new("Sequence"))
end
def self.register_sequence(sequence)
@ -65,7 +66,7 @@ module FactoryGirl
end
def self.traits
@traits ||= Registry.new("Trait")
@traits ||= StrictRegistry.new(Registry.new("Trait"))
end
def self.register_trait(trait)

View File

@ -2,31 +2,25 @@ module FactoryGirl
class Registry
include Enumerable
attr_reader :name
def initialize(name)
@name = name
@items = {}
end
def register(name, item)
if registered?(name)
raise DuplicateDefinitionError, "#{@name} already registered: #{name}"
else
@items[name.to_sym] = item
end
@items[name.to_sym] = item
end
def find(name)
@items[name.to_sym] or raise ArgumentError.new("#{@name} not registered: #{name.to_s}")
@items[name.to_sym]
end
def each(&block)
@items.values.uniq.each(&block)
end
def [](name)
find(name)
end
def registered?(name)
@items.key?(name.to_sym)
end

View File

@ -0,0 +1,25 @@
module FactoryGirl
class StrictRegistry
def initialize(component)
@component = component
end
delegate :each, :registered?, :clear, to: :@component
def register(name, item)
if registered?(name)
raise DuplicateDefinitionError, "#{@component.name} already registered: #{name}"
else
@component.register(name, item)
end
end
def find(name)
if registered?(name)
@component.find(name)
else
raise ArgumentError, "#{@component.name} not registered: #{name}"
end
end
end
end

View File

@ -13,10 +13,6 @@ describe FactoryGirl::Registry do
subject.find(:object_name).should == registered_object
end
it "raises when trying to find an unregistered object" do
expect { subject.find(:bogus) }.to raise_error(ArgumentError, "Great thing not registered: bogus")
end
it "adds and returns the object registered" do
subject.register(:object_name, registered_object).should == registered_object
end
@ -35,11 +31,6 @@ describe FactoryGirl::Registry do
subject.should_not be_registered("bogus")
end
it "can be accessed like a hash" do
subject.register(:object_name, registered_object)
subject[:object_name].should == registered_object
end
it "iterates registered objects" do
subject.register(:first_object, registered_object)
subject.register(:second_object, second_registered_object)
@ -52,11 +43,6 @@ describe FactoryGirl::Registry do
subject.to_a.should == [registered_object]
end
it "doesn't allow a duplicate name" do
expect { 2.times { subject.register(:same_name, registered_object) } }.
to raise_error(FactoryGirl::DuplicateDefinitionError, "Great thing already registered: same_name")
end
it "clears registered factories" do
subject.register(:object_name, registered_object)
subject.clear

View File

@ -0,0 +1,33 @@
require "spec_helper"
describe FactoryGirl::StrictRegistry do
let(:registry) { stub("registry", name: "Great thing", register: true, find: true, each: true, registered?: true, clear: true) }
subject { FactoryGirl::StrictRegistry.new(registry) }
it "delegates #each to the registry" do
block = -> {}
subject.each(block)
registry.should have_received(:each).with(block)
end
it "delegates #registered? to the registry" do
subject.registered?(:great_name)
registry.should have_received(:registered?).with(:great_name)
end
it "delegates #clear to the registry" do
subject.clear
registry.should have_received(:clear)
end
it "raises when trying to find an unregistered object" do
registry.stubs(registered?: false)
expect { subject.find(:bogus) }.to raise_error(ArgumentError, "Great thing not registered: bogus")
end
it "doesn't allow a duplicate name" do
expect { 2.times { subject.register(:same_name, {}) } }.
to raise_error(FactoryGirl::DuplicateDefinitionError, "Great thing already registered: same_name")
end
end