Ruby 加载时出错。/spec/controllers/users\u controller\u spec.rb

Ruby 加载时出错。/spec/controllers/users\u controller\u spec.rb,ruby,factory-bot,Ruby,Factory Bot,我正在创建工厂来替换我的固定装置并生成测试数据。我已安装FactoryBot,但在运行“rspec”时出错。这是我得到的结果日志: An error occurred while loading ./spec/controllers/users_controller_spec.rb. Failure/Error: @user = FactoryBot.create(:user) ActiveRecord::RecordInvalid: Validation failed: Email ha

我正在创建工厂来替换我的固定装置并生成测试数据。我已安装FactoryBot,但在运行“rspec”时出错。这是我得到的结果日志:

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
这是我的spec/controllers/users\u controller\u spec.rb

require 'rails_helper'

describe UsersController, type: :controller do

  @user = FactoryBot.create(:user)

  # let (:user) { User.create!(email:"achochaocierva@gmail.com", 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
这些错误意味着什么?我做错了什么

这些错误意味着什么?我做错了什么

您的工厂试图创建一个与现有用户具有相同电子邮件的用户(难怪,看到该电子邮件在工厂中是硬编码的)。数据库的唯一性约束有问题

用户电子邮件应该使用序列

# email "peter@example.com"
sequence(:email) { |n|   "factory_#{n}@example.com" }

此工厂的第一个用户将收到电子邮件“工厂”_1@example.com第二个“工厂”_2@example.com“,等等。

谢谢你的回答和编辑我的问题,非常抱歉,我还是很迷茫…当我从用户\u controller\u spec.rb中删除工厂“@user=FactoryBot.create(:user)”并使用夹具“let(:user){User.create!(电子邮件:achochaocierva@gmail.com,密码:“Ratadecierva2”)}我没有失败,也没有错误。有什么线索吗?非常感谢你的帮助help@Elena:此用户有不同的电子邮件,显然不会导致违反唯一性约束。但我已经在user_factory.rb中添加了序列,并且在使用工厂“@user=FactoryBot.create(:user)”时继续失败@我不这么认为。序列就行了。你在工厂里删除了硬编码的电子邮件了吗?你重新启动了spring吗?我已经删除了电子邮件,但我不知道spring是什么意思,对不起。不管怎样,我想可能是其他原因导致了错误,只要我使用工厂而不是夹具,都不会跟踪任何示例
# email "peter@example.com"
sequence(:email) { |n|   "factory_#{n}@example.com" }