Reputation: 43
I am creating factories to replace my fixtures and to generate Test Data. I've installed FactoryBot but I am getting an error when running "rspec". This is the outcome log I get:
An error occurred while loading ./spec/controllers/users_controller_spec.rb.
Failure/Error: @user = FactoryBot.create(:user)
ActiveRecord::RecordInvalid:
Validation failed: Email has already been taken
# ./spec/controllers/users_controller_spec.rb:5:in `block in <top (required)>'
# ./spec/controllers/users_controller_spec.rb:3:in `<top (required)>'
Finished in 0.00041 seconds (files took 38.38 seconds to load)
0 examples, 0 failures, 1 error occurred outside of examples
This is my spec/factories/user_factory.rb
FactoryBot.define do
factory :user do
email "[email protected]"
password "0123456"
first_name "Peter"
last_name "Example"
admin false
end
end
This is my spec/controllers/users_controller_spec.rb
require 'rails_helper'
describe UsersController, type: :controller do
@user = FactoryBot.create(:user)
# let (:user) { User.create!(email:"[email protected]", password: "Ratadecierva2")}
describe 'GET #show' do
context 'when a user is logged in' do
before do
sign_in user
end
it 'loads correct user details' do
get :show, params: { id: user.id }
expect(response).to be_ok
expect(assigns(:user)).to eq user
end
end
context 'when a user is not logged in' do
it 'redirects to login' do
get :show, params: { id: user.id }
expect(response).to redirect_to(new_user_session_path)
end
end
end
end
What would be the errors meaning? What am I doing wrong?
Upvotes: 3
Views: 3792
Reputation: 230531
What would be the errors meaning? What am I doing wrong?
Your factory tries to create a user with the same email as one of the existing users (no wonder, seeing that the email is hardcoded in the factory). Your DB's uniqueness constraint complains.
You should use sequences for user emails
# email "[email protected]"
sequence(:email) { |n| "factory_#{n}@example.com" }
First user from this factory will have email "[email protected]", second - "[email protected]", and so on.
Upvotes: 2