undefined方法Hartl第6章

时间:2014-06-29 02:47:42

标签: ruby-on-rails rspec

我目前正在研究Hartl的教程http://www.railstutorial.org/book/modeling_users

的6.3.3

运行rspec spec /我遇到以下故障 - 我确定我误解了指令或其他东西。我很高兴看到我做错了什么:

leo$ rspec spec/
............FFF...................

Failures:

  1) User return value of authenticate method with invalid password 
     Failure/Error: let(:user_for_invalid_password) { found_user.authenticate("invalid") }
     NoMethodError:
   undefined method `authenticate' for nil:NilClass
 # ./spec/models/user_spec.rb:92:in `block (4 levels) in <top (required)>'
 # ./spec/models/user_spec.rb:95:in `block (4 levels) in <top (required)>'

  2) User return value of authenticate method with invalid password 
 Failure/Error: it { should_not eq user_for_invalid }
 NameError:
   undefined local variable or method `user_for_invalid' for #    <RSpec::Core::ExampleGroup::Nested_2::Nested_10::Nested_2:0x007faed251c830>
 # ./spec/models/user_spec.rb:94:in `block (4 levels) in <top (required)>'

  3) User return value of authenticate method with valid password 
 Failure/Error: it { should eq found_user.authenticate(@user.password) }
 NoMethodError:
   undefined method `authenticate' for nil:NilClass
 # ./spec/models/user_spec.rb:88:in `block (4 levels) in <top (required)>'

Finished in 0.24185 seconds
34 examples, 3 failures

Failed examples:

rspec ./spec/models/user_spec.rb:95 # User return value of authenticate method with invalid password 
rspec ./spec/models/user_spec.rb:94 # User return value of authenticate method with invalid password 
rspec ./spec/models/user_spec.rb:88 # User return value of authenticate method with valid password 

这是我在user_spec.rb文件中的内容:

require '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 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[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
        expect(@user).not_to 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.1st@foo.jp a+b@baz.cn]
    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: "user@example.com", 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

 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.password) }

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 }
    specify { expext(user_for_invalid_password).to be_false }
end
 end
end

以下是我在user.rb文件中的内容:

class User < ActiveRecord::Base
    before_save { self.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 }
    has_secure_password
    validates :password, length: { minimum:6 }
end

1 个答案:

答案 0 :(得分:0)

找到你的错字:

describe "return value of authenticate method" do

  # should find by @user.email
  let(:found_user) { User.find_by(email: @user.password) }

end