Elena
Elena

Reputation: 43

An error occurred while loading ./spec/controllers/users_controller_spec.rb

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

Answers (1)

Sergio Tulentsev
Sergio Tulentsev

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

Related Questions