I've been trying to pass the last test in this chapter but all my tests return a invalid hash error.
Here is the error :
Failures:
1) User
Failure/Error: password_digest: BCrypt::Password.create('foobar').to_s)
BCrypt::Errors::InvalidHash:
invalid hash
# ./spec/models/user_spec.rb:20:in `block (2 levels) in <top (required)>'
2) User
Failure/Error: password_digest: BCrypt::Password.create('foobar').to_s)
BCrypt::Errors::InvalidHash:
invalid hash
# ./spec/models/user_spec.rb:20:in `block (2 levels) in <top (required)>'
3) User
Failure/Error: password_digest: BCrypt::Password.create('foobar').to_s)
BCrypt::Errors::InvalidHash:
invalid hash
# ./spec/models/user_spec.rb:20:in `block (2 levels) in <top (required)>'
4) User
Failure/Error: password_digest: BCrypt::Password.create('foobar').to_s)
BCrypt::Errors::InvalidHash:
invalid hash
# ./spec/models/user_spec.rb:20:in `block (2 levels) in <top (required)>'
...
Finished in 1.34 seconds
20 examples, 20 failures
user.rb file :
class User < ActiveRecord::Base
attr_accessible :name, :email, :password, :password_confirmation, :password_digest
has_secure_password
before_save { |user| user.email = email.downcase }
validates :name, presence: true, length: { maximum: 50 }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
validates :email, presence: true,
format: { with: VALID_EMAIL_REGEX },
uniqueness: { case_sensitive: false }
validates :password, presence: true, length: { minimum: 6 }
validates :password_confirmation, presence: true
end
user_spec.rb file :
require 'spec_helper'
require 'bcrypt'
describe User do
before do
@user = User.new(name: "Example User", email: "[email protected]",
password: "foobar", password_confirmation: "foobar",
password_digest: BCrypt::Password.create('foobar').to_s)
end
subject { @user }
it { should respond_to(:name) }
it { should respond_to(:email) }
it { should respond_to(:password_digest) }
it { should respond_to(:password) }
it { should respond_to(:password_confirmation) }
it { should be_valid }
describe "when name is not present" do
before { @user.name = " " }
it { should_not be_valid }
end
describe "when email is not present" do
before { @user.email = " " }
it { should_not be_valid }
end
describe "when name is too long" do
before { @user.name = "a" * 51 }
it { should_not be_valid }
end
describe "when email format is invalid" do
it "should be invalid" do
addresses = %w[user@foo,com user_at_foo.org example.user@foo.
foo@bar_baz.com foo@bar+baz.com]
addresses.each do |invalid_address|
@user.email = invalid_address
@user.should_not be_valid
end
end
end
describe "when email format is valid" do
it "should be valid" do
addresses = %w[[email protected] [email protected] [email protected] [email protected]]
addresses.each do |valid_address|
@user.email = valid_address
@user.should be_valid
end
end
end
describe "when email address is already taken" do
before do
user_with_same_email = @user.dup
user_with_same_email.email = @user.email.upcase
user_with_same_email.save
end
it { should_not be_valid }
end
describe "when password is not present" do
before { @user.password = @user.password_confirmation = " " }
it { should_not be_valid }
end
describe "when password doesn't match confirmation" do
before { @user.password_confirmation = "mismatch" }
it { should_not be_valid }
end
describe "when password confirmation is nil" do
before { @user.password_confirmation = nil }
it { should_not be_valid }
end
describe "with a password that's too short" do
before { @user.password = @user.password_confirmation = "a" * 5 }
it { should be_invalid }
end
describe "return value of authenticate method" do
before { @user.save }
let(:found_user) { User.find_by_email(@user.email) }
describe "with valid password" do
it { should == found_user.authenticate(@user.password) }
end
describe "with invalid password" do
let(:user_for_invalid_password) { found_user.authenticate("invalid") }
it { should_not == user_for_invalid_password }
specify { user_for_invalid_password.should be_false }
end
end
end
GemFile :
source 'https://rubygems.org'
gem 'rails', '3.2.22.5'
gem 'bootstrap-sass', '2.1'
gem 'bcrypt-ruby', '3.0.1'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
group :development, :test do
gem 'sqlite3', '1.3.5'
gem 'rspec-rails', '2.11.0'
end
group :development do
gem 'annotate', '2.5.0'
end
# Gems used only for assets and not required
# in production environments by default.
group :assets do
gem 'sass-rails', '3.2.5'
gem 'coffee-rails', '3.2.2'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes
# gem 'therubyracer', :platforms => :ruby
gem 'uglifier', '1.2.3'
end
gem 'jquery-rails', '2.0.2'
group :test do
gem 'capybara', '1.1.2'
end
group :production do
gem 'pg', '0.12.2'
end
gem 'rake', '< 11.0'
I've been trying to make a random user in the console with same results. Tried to change the gem for bcrypt-3.1.12 but it kept asking to add bcryptruby instead. Decided to copy paste the exact code from the tutorial and the problem is still the same.
Any help would be very appreciated, thank you !