I ran into a dilemma with one of my rspec controller test suites while working on a personal website with book and author models.
It occurred as I was using the amazing factory_girl gem, which allows me to pre-define the attributes for a model into a factory to be used over and over again throughout my test suite. That way any time I need to fire up a test instance of a particular model, I can very easily with code like:
@whatever = FactoryGirl.create(:whatever)
Here’s a link to factory girl, I’d highly recommend it:
https://github.com/thoughtbot/factory_girl
Now, my issue occurred because I was creating a user factory with the following code prior to each test in the book’s controller spec.
@user = FactoryGirl.create(:user)
I kept getting a validation error, because my Factory was trying to create users with the same email for each new test. This was bad because I was validating for unique email in my model.
Through some clever Google searching, I finally ran into a wonderful RailCast video that pointed me in the right direction:
http://railscasts.com/episodes/158-factories-not-fixtures
After watching the video, I discovered that I needed to update the email assigning portion of my factory to look like the following:
FactoryGirl.define do
factory :user do |f|
f.name "foo"
f.sequence(:email) {|n| “foo#{n}@example.com”}
end
end
That bolded line had previously just been
f.email "foo@example.com"
As you can probably tell, I’m now creating a unique email based on the value “n” that got me out of the validation trouble I’d found myself in.
Thank’s RailCasts!
[…] me in on a little trick that I’d like to share. When testing, it’s a good idea to have factories written for each model. Now, if your model is already created, you’ll have to spin up that factory […]