Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I reset a factory_girl sequence?

Provided that I have a project factory

Factory.define :project do |p|   p.sequence(:title)    { |n| "project #{n} title"                  }   p.sequence(:subtitle) { |n| "project #{n} subtitle"               }   p.sequence(:image)    { |n| "../images/content/projects/#{n}.jpg" }   p.sequence(:date)     { |n| n.weeks.ago.to_date                   } end 

And that I'm creating instances of project

Factory.build :project Factory.build :project 

By this time, the next time I execute Factory.build(:project) I'll receive an instance of Project with a title set to "project 3 title" and so on. Not surprising.

Now say that I wish to reset my counter within this scope. Something like:

Factory.build :project #=> Project 3 Factory.reset :project #=> project factory counter gets reseted Factory.build :project #=> A new instance of project 1 

What would be the best way to achieve this?

I'm currently using the following versions:

factory_girl (1.3.1) factory_girl_rails (1.0)

like image 423
DBA Avatar asked Jul 29 '10 02:07

DBA


1 Answers

Just call FactoryGirl.reload in your before/after callback. This is defined in the FactoryGirl codebase as:

module FactoryGirl   def self.reload     self.factories.clear     self.sequences.clear     self.traits.clear     self.find_definitions   end end 

Calling FactoryGirl.sequences.clear is not sufficient for some reason. Doing a full reload might have some overhead, but when I tried with/without the callback, my tests took around 30 seconds to run either way. Therefore the overhead is not enough to impact my workflow.

like image 83
brandon Avatar answered Sep 27 '22 17:09

brandon