Permalink
Browse files

Ensure attributes set on instance are calculated uniquely

This fixes a bug where assignment occurs multiple times; in the case of
nested attributes, assignment mutates the instance, meaning that it
occurring multiple times will cause issues.

Closes #314
  • Loading branch information...
1 parent 0d7520e commit f5d4db10855978ee054687ba2e04882f65e76630 @joshuaclayton joshuaclayton committed Mar 16, 2012
Showing with 33 additions and 1 deletion.
  1. +1 −1 lib/factory_girl/attribute_assigner.rb
  2. +32 −0 spec/acceptance/nested_attributes_spec.rb
@@ -37,7 +37,7 @@ def get(attribute_name)
end
def attributes_to_set_on_instance
- attribute_names_to_assign - @attribute_names_assigned
+ (attribute_names_to_assign - @attribute_names_assigned).uniq
end
def attributes_to_set_on_hash
@@ -0,0 +1,32 @@
+require "spec_helper"
+
+describe "association assignment from nested attributes" do
+ before do
+ define_model("Post", :title => :string) do
+ has_many :comments
+ accepts_nested_attributes_for :comments
+ end
+
+ define_model("Comment", :post_id => :integer, :body => :text) do
+ belongs_to :post
+ end
+
+ FactoryGirl.define do
+ factory :post do
+ comments_attributes { [FactoryGirl.attributes_for(:comment), FactoryGirl.attributes_for(:comment)] }
+ end
+
+ factory :comment do
+ sequence(:body) {|n| "Body #{n}" }
+ end
+ end
+ end
+
+ it "assigns the correct amount of comments" do
+ FactoryGirl.create(:post).comments.count.should == 2
+ end
+
+ it "assigns the correct amount of comments when overridden" do
+ FactoryGirl.create(:post, :comments_attributes => [FactoryGirl.attributes_for(:comment)]).comments.count.should == 1
+ end
+end

0 comments on commit f5d4db1

Please sign in to comment.