I use the sequence in Factory Girl to get unique values, but I get validation errors

I have a model defined this way

class Lga < ActiveRecord::Base validates_uniqueness_of :code validates_presence_of :name end 

I defined a factory for lgas with

 Factory.sequence(:lga_id) { |n| n + 10000 } Factory.define :lga do |l| id = Factory.next :lga_id l.code "lga_#{id}" l.name "LGA #{id}" end 

However, when I run

 Factory.create(:lga) Factory.create(:lga) 

in script/console I get

 >> Factory.create(:lga) => #<Lga id: 2, code: "lga_10001", name: "LGA 10001", created_at: "2010-03-18 23:55:29", updated_at: "2010-03-18 23:55:29"> >> Factory.create(:lga) ActiveRecord::RecordInvalid: Validation failed: Code has already been taken 
+7
ruby-on-rails factory-bot
source share
2 answers

The problem was that the code and name attributes were not so-called lazy attributes. I thought to write something like:

 Factory.define :lga do |l| l.code { |n| "lga_#{n+10000}" } end 

but I wanted to reuse the identifier in the name attribute. You can see what id is evaluated every time Factory.create is called by placing it in the after_build hook.

 Factory.define :lga do |l| l.after_build do |lga| id = Factory.next :lga_id lga.code = "lga_#{id}" lga.name = "LGA #{id}" end end 

This only works in FactoryGirl 1.2.3 and higher.

+7
source share

The previous answer is still correct, but you will get a warning in new versions of FactoryGirl.

 Factory.next has been depreciated. Use FactoryGirl.generate instead. 

The new code should look like this:

 Factory.define :lga do |l| l.after_build do |lga| id = FactoryGirl.generate :lga_id lga.code = "lga_#{id}" lga.name = "LGA #{id}" end end 

Source: http://notesofgreg.blogspot.co.uk/2012/07/foolproof-factorygirl-sequence.html

+2
source share

All Articles