加载 ./spec/controllers/users_controller_spec.rb 时出错
An error occurred while loading ./spec/controllers/users_controller_spec.rb
我正在创建工厂来替换我的固定装置并生成测试数据。我已经安装了 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/factories/user_factory.rb
FactoryBot.define do
factory :user do
email "peter@example.com"
password "0123456"
first_name "Peter"
last_name "Example"
admin false
end
end
这是我的 spec/controllers/users_controller_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
错误是什么意思?我做错了什么?
What would be the errors meaning? What am I doing wrong?
你的工厂试图创建一个用户,使用与现有用户之一相同的电子邮件地址(难怪,看到电子邮件地址在工厂中是硬编码的)。您的数据库的唯一性约束抱怨。
您应该为用户电子邮件使用序列
# email "peter@example.com"
sequence(:email) { |n| "factory_#{n}@example.com" }
该工厂的第一位用户将收到电子邮件 "factory_1@example.com",第二位 - "factory_2@example.com",依此类推。
我正在创建工厂来替换我的固定装置并生成测试数据。我已经安装了 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/factories/user_factory.rb
FactoryBot.define do
factory :user do
email "peter@example.com"
password "0123456"
first_name "Peter"
last_name "Example"
admin false
end
end
这是我的 spec/controllers/users_controller_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
错误是什么意思?我做错了什么?
What would be the errors meaning? What am I doing wrong?
你的工厂试图创建一个用户,使用与现有用户之一相同的电子邮件地址(难怪,看到电子邮件地址在工厂中是硬编码的)。您的数据库的唯一性约束抱怨。
您应该为用户电子邮件使用序列
# email "peter@example.com"
sequence(:email) { |n| "factory_#{n}@example.com" }
该工厂的第一位用户将收到电子邮件 "factory_1@example.com",第二位 - "factory_2@example.com",依此类推。