Added an exception when defining a sequence from a dynamic attribute block [#43 state:resolved]

This commit is contained in:
Joe Ferris 2009-04-13 21:39:19 -04:00
parent 683aa43fab
commit fa3a555c19
4 changed files with 27 additions and 3 deletions

View File

@ -2,14 +2,17 @@ class Factory
class Attribute #:nodoc:
class Dynamic < Attribute #:nodoc:
def initialize(name, block)
super(name)
@block = block
end
def add_to(proxy)
proxy.set(name, @block.call(proxy))
value = @block.call(proxy)
if Factory::Sequence === value
raise SequenceAbuseError
end
proxy.set(name, value)
end
end

View File

@ -1,5 +1,8 @@
class Factory
# Raised when calling Factory.sequence from a dynamic attribute block
class SequenceAbuseError < StandardError; end
# Sequences are defined using Factory.sequence. Sequence values are generated
# using next.
class Sequence

View File

@ -33,6 +33,16 @@ describe Factory::Attribute::Dynamic do
}.should raise_error(Factory::AttributeDefinitionError)
end
it "should raise an error when returning a sequence" do
stub(Factory).sequence { Factory::Sequence.new }
block = lambda { Factory.sequence(:email) }
attr = Factory::Attribute::Dynamic.new(:email, block)
proxy = stub!.set.subject
lambda {
attr.add_to(proxy)
}.should raise_error(Factory::SequenceAbuseError)
end
it "should convert names to symbols" do
Factory::Attribute::Dynamic.new('name', nil).name.should == :name
end

View File

@ -1,7 +1,6 @@
require File.expand_path(File.join(File.dirname(__FILE__), 'spec_helper'))
describe "integration" do
before do
Factory.define :user, :class => 'user' do |f|
f.first_name 'Jimi'
@ -23,6 +22,10 @@ describe "integration" do
f.email { Factory.next(:email) }
end
Factory.define :sequence_abuser, :class => User do |f|
f.first_name { Factory.sequence(:email) }
end
Factory.define :guest, :parent => :user do |f|
f.last_name 'Anonymous'
f.username 'GuestUser'
@ -233,4 +236,9 @@ describe "integration" do
end
end
it "should raise Factory::SequenceAbuseError" do
lambda {
Factory(:sequence_abuser)
}.should raise_error(Factory::SequenceAbuseError)
end
end