私はこれに数時間苦労してきましたが、どこにも答えが見つかりません。
基本的に、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)>'
私は、この仕様を解決するのが妨げられるところまで来ましたが、これは決して良いことではありません。実装は既に機能しているためです。
物事を動かすためだけに、なんらかの理由で失敗しているテストをスキップし始めたくないので、誰かがここで私を助けてくれたら素晴らしいでしょう。
ダイジェストを保存するために has_secure_password に対して呼び出される before メソッドを rspec が「無視」しているように感じますが、よくわかりません。リクエスト仕様が正常に機能した場合、これは私が気付いていないことをしているので、私はただ推測しています。
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
user.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