2014-07-11 2 views
0

누군가 도움을 줄 수 있습니까? 여기 Hartl Chapter 6

Failures: 

    1) with a password that's too short 
    Failure/Error: before { @user.password = @user.password_confirmation = "a" * 5 } 
    NoMethodError: 
     undefined method `password_confirmation=' for nil:NilClass 
    # ./spec/models/user_spec.rb:80:in `block (2 levels) in <top (required)>' 

    2) return value of authenticate method with invalid password 
    Failure/Error: before { @user.save } 
    NoMethodError: 
     undefined method `save' for nil:NilClass 
    # ./spec/models/user_spec.rb:85:in `block (2 levels) in <top (required)>' 

    3) return value of authenticate method with invalid password 
    Failure/Error: before { @user.save } 
    NoMethodError: 
     undefined method `save' for nil:NilClass 
    # ./spec/models/user_spec.rb:85:in `block (2 levels) in <top (required)>' 

    4) return value of authenticate method with valid password 
    Failure/Error: before { @user.save } 
    NoMethodError: 
     undefined method `save' for nil:NilClass 
    # ./spec/models/user_spec.rb:85:in `block (2 levels) in <top (required)>' 

Finished in 2.55 seconds 
30 examples, 4 failures 

Failed examples: 

rspec ./spec/models/user_spec.rb:81 # with a password that's too short 
rspec ./spec/models/user_spec.rb:96 # return value of authenticate method with invalid password 
rspec ./spec/models/user_spec.rb:95 # return value of authenticate method with invalid password 
rspec ./spec/models/user_spec.rb:89 # return value of authenticate method with valid password 


내 user_spec이다 : 나는 마이클 하틀의 끝에 시험과 문제가 발생하고있어 튜토리얼, 장 6.

여기

내 테스트의 결과가 레일 :

require 'spec_helper' 

describe User do 

    before do 
    @user = User.new(name: "Example User", email: "[email protected]", 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 respond_to(:authenticate) } 
    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[[email protected],com user_at_foo.org [email protected] 
        [email protected]_baz.com [email protected]+baz.com] 
     addresses.each do |invalid_address| 
     @user.email = invalid_address 
     expect(@user).not_to 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 
     expect(@user).to 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 do 
     @user = User.new(name: "Example User", email: "[email protected]", 
         password: "", password_confirmation: "") 
    end 
    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 
    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 eq found_user.authenticate(@user.password) } 
    end 

    describe "with invalid password" do 
     let(:user_for_invalid_password) { found_user.authenticate("invalid") } 

     it { should_not eq user_for_invalid_password } 
     specify { expect(user_for_invalid_password).to be_false } 
    end 
    end 

그리고 여기 내 사용자입니다 .rb

class User < ActiveRecord::Base 
    before_save { self.email = email.downcase } 

    validates :name, presence: true, length: { maximum: 50 } 

    VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 

    validates :email, presence: true, 
        format:  { with: VALID_EMAIL_REGEX }, 
        uniqueness: { case_sensitive: false } 

    has_secure_password 

    validates :password, length: { minimum: 6 } 

end 

어떤 도움이 많이 주시면 감사하겠습니다.

답변

0

문제가 귀하의 블록에 있습니다. 먼저 before 블록에 @user을 정의하면 작동합니다. 그러나 어떤 줄에서 시작해서 깨졌습니다. 문제가 너무 많습니다. end

require 'spec_helper' 

describe User do 

    before do 
    @user = User.new(name: "Example User", email: "[email protected]", password: "foobar", password_confirmation: "foobar") 
    end 

    subject { @user } 

    ... # first specs 

    describe "when password doesn't match confirmation" do 
    before { @user.password_confirmation = "mismatch" } 
    it { should_not be_valid } 
    end 
end # <--- THIS `end` ends main describe block. And next describe block can't use any before blocks before 

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 eq found_user.authenticate(@user.password) } 
    end 

    describe "with invalid password" do 
    let(:user_for_invalid_password) { found_user.authenticate("invalid") } 

    it { should_not eq user_for_invalid_password } 
    specify { expect(user_for_invalid_password).to be_false } 
    end 
end 
+0

문제가 해결되었습니다. 고마워. 나는 그 "끝"을 맨 끝에 놓기 만하면되었다. – user3813612

관련 문제