From 930c21aed7ca6d64e14597fdcd0955e1be8f1305 Mon Sep 17 00:00:00 2001 From: Joshua Clayton Date: Wed, 15 Apr 2015 21:59:13 -0400 Subject: [PATCH] Check arity to allow for Symbol#to_proc with dynamic attributes Closes #698 --- lib/factory_girl/attribute/dynamic.rb | 5 +++- spec/acceptance/definition_spec.rb | 33 +++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/lib/factory_girl/attribute/dynamic.rb b/lib/factory_girl/attribute/dynamic.rb index b8eebca..55e8325 100644 --- a/lib/factory_girl/attribute/dynamic.rb +++ b/lib/factory_girl/attribute/dynamic.rb @@ -11,7 +11,10 @@ module FactoryGirl block = @block -> { - value = block.arity == 1 ? instance_exec(self, &block) : instance_exec(&block) + value = case block.arity + when 1, -1 then instance_exec(self, &block) + else instance_exec(&block) + end raise SequenceAbuseError if FactoryGirl::Sequence === value value } diff --git a/spec/acceptance/definition_spec.rb b/spec/acceptance/definition_spec.rb index 133524b..04b4836 100644 --- a/spec/acceptance/definition_spec.rb +++ b/spec/acceptance/definition_spec.rb @@ -19,3 +19,36 @@ describe "an instance generated by a factory with a custom class name" do it { should be_admin } end +describe "attributes defined using Symbol#to_proc" do + before do + define_model("User", password: :string, password_confirmation: :string) + + FactoryGirl.define do + factory :user do + password "foo" + password_confirmation &:password + end + end + end + + it "assigns values correctly" do + user = FactoryGirl.build(:user) + + expect(user.password).to eq "foo" + expect(user.password_confirmation).to eq "foo" + end + + it "assigns value with override correctly" do + user = FactoryGirl.build(:user, password: "bar") + + expect(user.password).to eq "bar" + expect(user.password_confirmation).to eq "bar" + end + + it "assigns overridden value correctly" do + user = FactoryGirl.build(:user, password_confirmation: "bar") + + expect(user.password).to eq "foo" + expect(user.password_confirmation).to eq "bar" + end +end