diff --git a/lib/factory_girl/evaluator.rb b/lib/factory_girl/evaluator.rb index 54f56c8..8d55378 100644 --- a/lib/factory_girl/evaluator.rb +++ b/lib/factory_girl/evaluator.rb @@ -11,13 +11,21 @@ module FactoryGirl end end end - undef_method(:id) if method_defined?(:id) + + private_instance_methods.each do |method| + undef_method(method) unless method =~ /^__|initialize/ + end def initialize(build_strategy, overrides = {}) @build_strategy = build_strategy @overrides = overrides @cached_attributes = overrides + singleton = class << self; self end + @overrides.each do |name, value| + singleton.send :define_method, name, lambda { value } + end + @build_strategy.add_observer(CallbackRunner.new(self.class.callbacks, self)) end diff --git a/spec/acceptance/attribute_existing_on_object_spec.rb b/spec/acceptance/attribute_existing_on_object_spec.rb index 4a776f0..91fb58f 100644 --- a/spec/acceptance/attribute_existing_on_object_spec.rb +++ b/spec/acceptance/attribute_existing_on_object_spec.rb @@ -19,3 +19,50 @@ describe "declaring attributes on a Factory that are private methods on Object" its(:link) { should == "http://example.com" } its(:sleep) { should == -5 } end + +describe "assigning overrides that are also private methods on object" do + before do + define_model("Website", :format => :string, :y => :integer, :more_format => :string, :some_funky_method => :string) + + Object.class_eval do + private + def some_funky_method(args) + end + end + + FactoryGirl.define do + factory :website do + more_format { "format: #{format}" } + end + end + end + + after do + Object.send(:undef_method, :some_funky_method) + end + + subject { FactoryGirl.build(:website, :format => "Great", :y => 12345, :some_funky_method => "foobar!") } + its(:format) { should == "Great" } + its(:y) { should == 12345 } + its(:more_format) { should == "format: Great" } + its(:some_funky_method) { should == "foobar!" } +end + +describe "accessing methods from the instance within a dynamic attribute that is also a private method on object" do + before do + define_model("Website", :more_format => :string) do + def format + "This is an awesome format" + end + end + + FactoryGirl.define do + factory :website do + more_format { "format: #{format}" } + end + end + end + + subject { FactoryGirl.build(:website) } + its(:more_format) { should == "format: This is an awesome format" } +end