【发布时间】:2013-07-13 23:45:10
【问题描述】:
我已经为此苦苦挣扎了几个小时,但在任何地方都找不到答案。
基本上我正在使用 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 方法,但我不确定。我只是假设,因为如果请求规范运行良好,这是在做我不知道的事情。
我正在使用 rails 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
【问题讨论】:
-
您的测试数据库的
users表中是否存在password_digest列? -
列存在,是的。 :(
标签: ruby-on-rails rspec ruby-on-rails-4 shoulda