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)
Thanks in advance, Best regards.
For googling people: without further extending, just do
FactoryGirl.reload
works for me on
https://stackoverflow.com/a/16048658
According to ThoughBot Here, the need to reset the sequence between tests is an anti-pattern.
To summerize:
If you have something like this:
Your tests should look like this:
Not This:
This is pretty old, but it's the top result on google for the relevant keywords. For anyone else stumbling across this.
There is a class method called
sequence_by_name
to fetch a sequence by name, and then you can callrewind
and it'll reset to 1.Or if you want to reset all.
Here is the link to the file on github
Hey everybody, After tracing my way through the source code, I have finally come up with a solution for this. If you're using factory_girl 1.3.2 (which was the latest release at the time I am writing this), you can add the following code to the top of your factories.rb file:
Then, in Cucumber's env.rb, simply add:
I'd assume if you run into the same problem in your rspec tests, you could use rspecs after :each method.
At the moment, this approach only takes into consideration sequences defined within a factory, such as:
I have not yet written the code to handle: Factory.sequence ...
Hope this helps all the other frustrated people out there who cannot understand why in the world factory girl doesn't provide this already. Maybe I'll fork the github project and submit a pull request with this fix since it doesn't change any of their internal functionality.
-Andrew
Had to ensure sequences are going from 1 to 8 and restart to 1 and so on. Implemented like this:
The doc says "The value just needs to support the
#next
method." But to keep you CustomSequence object going through it needs to support#peek
method too. Lastly I don't know how long this will work because it kind of hack into FactoryGirl internals, when they make a change this may fail to work properlyThere's no built in way to reset a sequence, see the source code here:
http://github.com/thoughtbot/factory_girl/blob/master/lib/factory_girl/sequence.rb
However, some people have hacked/monkey-patched this feature in. Here's an example:
http://www.pmamediagroup.com/2009/05/smarter-sequencing-in-factory-girl/