-1

誰かが助けてくれることを願っています。私は Michael Hartl の rails チュートリアルブックを読んでいて、章 6.3.4で立ち往生しています。すべてのテストを検証しようとしていますが、いくつかのエラーが発生し続けています。参照用にエラー メッセージと user.rb および user_spec.rb ファイルを投稿しました。うまくいけば、誰かが私が間違っているところを見ることができます。どんな助けでも大歓迎です。

エラー

Failures:

  1) when email address is already taken
     ←[31mFailure/Error:←[0m ←[31muser_with_same_email = @user.dup←[0m
     ←[31mTypeError:←[0m
       ←[31mcan't dup NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:69:in `dup'←[0m
←[36m     # ./spec/models/user_spec.rb:69:in `block (5 levels) in <top (required
)>'←[0m

  2) when password is not present
     ←[31mFailure/Error:←[0m ←[31mbefore { @user.password = @user.password_confi
rmation = " " }←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `password_confirmation=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:78:in `block (5 levels) in <top (required
)>'←[0m

  3) when password doesn't match confirmation
     ←[31mFailure/Error:←[0m ←[31mbefore { @user.password_confirmation = "mismat
ch" }←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `password_confirmation=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:83:in `block (5 levels) in <top (required
)>'←[0m

  4) when password confirmation is nil
     ←[31mFailure/Error:←[0m ←[31mbefore { @user.password_confirmation = nil }←[
0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `password_confirmation=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:88:in `block (5 levels) in <top (required
)>'←[0m

  5) with a password that's too short
     ←[31mFailure/Error:←[0m ←[31mbefore { @user.password = @user.password_confi
rmation = "a" * 5 }←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `password_confirmation=' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:93:in `block (5 levels) in <top (required
)>'←[0m

  6) return value of authticate method with valid password
     ←[31mFailure/Error:←[0m ←[31mbefore { @user.save }←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `save' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:98:in `block (5 levels) in <top (required
)>'←[0m

  7) return value of authticate method with invalid password
     ←[31mFailure/Error:←[0m ←[31mbefore { @user.save }←[0m
     ←[31mNoMethodError:←[0m
       ←[31mundefined method `save' for nil:NilClass←[0m
←[36m     # ./spec/models/user_spec.rb:98:in `block (5 levels) in <top (required
)>'←[0m

user.rb ファイル

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation
  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

「spec_helper」が必要

describe User do

    before do
        @user = User.new(   name: "Example User", email: "user@example.com", 
                            password: "foobar", password_confirmation: "foobar")
    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 }

        it { should respond_to(:authenticate) }

        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[user@foo.COM A_US-ER@f.b.org frst.lst@foo.jp a+b@baz.cn]
                addresses.each do |valid_address|
                    @user.email = valid_address
                    @user.should be_valid
        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 authticate 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") }
            specify { user_for_invalid_password.should be_false }
        end

        end             
    end
end     

終わり

4

1 に答える 1