我已经为此苦苦挣扎了几个小时,但我在任何地方都找不到答案。
基本上我正在使用 shoulda 为我的模型编写规范,并且出于某种原因,即使我的 let 工作正常并且实际应用程序工作正常(手动确认并使用请求规范),如果我包括:
it { expect(user).to validate_uniqueness_of :email }
在我的描述块中,我将收到以下错误:
1) User attributes should require case sensitive unique value for email
Failure/Error: it { expect(user).to validate_uniqueness_of :email }
RuntimeError:
Password digest missing on new record
# ./spec/models/user_spec.rb:14:in `block (3 levels) in <top (required)>'
我已经到了解决这个规范让我退缩的地步,这从来都不是一件好事,因为实施已经奏效了。
如果有人可以在这里帮助我,那就太好了,因为我真的不想为了让事情顺利进行而开始跳过由于某种不明原因而失败的测试。
我觉得好像 rspec 正在“忽略”调用 has_secure_password 以保存摘要的 before 方法,但我不确定。我只是假设,因为如果请求规范工作正常,这是在做我不知道的事情。
我正在使用导轨 4.0.0
以下是与此相关的代码。我很感激任何帮助。谢谢
user_spec.rb
require 'spec_helper'
describe User do
let(:user) {
user = User.new(:email => 'example@example.com',
:username => 'theo',
:password => 'secretpass',
:password_confirmation => 'secretpass')}
describe "attributes" do
it { expect(user).to validate_presence_of :email }
it { expect(user).to validate_uniqueness_of :email }
it { expect(user).to validate_presence_of :username }
it { expect(user).to validate_uniqueness_of :username }
it "saves are saved" do
user.save!
expect(user).to be_valid
end
end
end
用户.rb
class User < ActiveRecord::Base
has_secure_password
validates :email, :username, presence: true, uniqueness: true
validates :password, presence: true, :on => :create
end
users_controller.rb
class UsersController < ApplicationController
def index
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
redirect_to root_path, :notice => 'You have successfully signed up.'
else
render 'new'
end
end
private
def user_params
params.require(:user).permit(:email, :username, :password, :password_confirmation)
end
end