Michael Hartls教程第6章-User_spec.rb-大规模测试失败

时间:2012-09-18 11:10:33

标签: ruby-on-rails ruby

我正在研究michael hartl rails教程。当前第6章。编辑user_spec.rb文件后,我尝试运行测试,但是我遇到了大量的失败:

C:\rails_project\sample_app>bundle exec rspec spec/
←[32m.←[0m←[32m.←[0m←[33m*←[0m←[31mF←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m
←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m
←[31mF←[0m←[32m.←[0m←[31mF←[0m←[31mF←[0m←[31mF←[0m←[31mF←[0m←[32m.←[0m←[31mF←[0m
←[31mF←[0m←[31mF←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m
←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[33m*←[0m

Pending:
←[33m  UsersHelper add some examples to (or delete) C:/rails_project/sample_app/
spec/helpers/users_helper_spec.rb←[0m
←[36m    # No reason given←[0m
←[36m    # ./spec/helpers/users_helper_spec.rb:14←[0m
←[33m  users/new.html.erb add some examples to (or delete) C:/rails_project/samp
le_app/spec/views/users/new.html.erb_spec.rb←[0m
←[36m    # No reason given←[0m
←[36m    # ./spec/views/users/new.html.erb_spec.rb:4←[0m

Failures:

  1) User
     ←[31mFailure/Error:←[0m ←[31mit { should be_valid }←[0m
        ←[31mexpected valid? to return true, got false←[0m
←[36m     # ./spec/models/user_spec.rb:31:in `block (2 levels) in <top (required
)>'←[0m

  2) User when email format is valid should be valid
    ←[31mFailure/Error:←[0m ←[31m@user.should be_valid←[0m
      ←[31mexpected valid? to return true, got false←[0m
←[36m     # ./spec/models/user_spec.rb:64:in `block (4 levels) in <top (required
)>'←[0m
←[36m     # ./spec/models/user_spec.rb:62:in `each'←[0m
←[36m     # ./spec/models/user_spec.rb:62:in `block (3 levels) in <top (required
)>'←[0m

 3) User with a password that's too short
     ←[31mFailure/Error:←[0m ←[31mit { should be_valid }←[0m
        ←[31mexpected valid? to return true, got false←[0m
←[36m     # ./spec/models/user_spec.rb:112:in `block (3 levels) in <top (require
d)>'←[0m

4) User return value of authenticate method with valid password
 ←[31mFailure/Error:←[0m ←[31mit { should == found_user.authenticate(@user.p
assword) }←[0m
 ←[31mNoMethodError:←[0m
   ←[31mundefined method `authenticate' for nil:NilClass←[0m
 ←[36m     # ./spec/models/user_spec.rb:99:in `block (4 levels) in <top (required
)>'←[0m

5) User return value of authenticate method with invalid password
 ←[31mFailure/Error:←[0m ←[31mlet(:user_for_invalid_password) { found_user.a
uthenticate("invalid") }←[0m
 ←[31mNoMethodError:←[0m
   ←[31mundefined method `authenticate' for nil:NilClass←[0m
 ←[36m     # ./spec/models/user_spec.rb:103:in `block (4 levels) in <top (require
 d)>'←[0m
 ←[36m     # ./spec/models/user_spec.rb:105:in `block (4 levels) in <top (require
 d)>'←[0m

   6) User return value of authenticate method with invalid password
 ←[31mFailure/Error:←[0m ←[31mlet(:user_for_invalid_password) { found_user.a
 uthenticate("invalid") }←[0m
 ←[31mNoMethodError:←[0m
   ←[31mundefined method `authenticate' for nil:NilClass←[0m
 ←[36m     # ./spec/models/user_spec.rb:103:in `block (4 levels) in <top (require
 d)>'←[0m
 ←[36m     # ./spec/models/user_spec.rb:106:in `block (4 levels) in <top (require
 d)>'←[0m

   7) User return value of authenticate method with valid password
      ←[31mFailure/Error:←[0m ←[31mit { should == found_user.authenticate(@user.e
 mail) }←[0m
      ←[31mNoMethodError:←[0m
        ←[31mundefined method `authenticate' for nil:NilClass←[0m
   ←[36m     # ./spec/models/user_spec.rb:120:in `block (4 levels) in <top (require
   d)>'←[0m

   8) User return value of authenticate method with invalid password
      ←[31mFailure/Error:←[0m ←[31mlet(:user_for_invalid_password) { found_user.a
  uthenticate("invalid") }←[0m
      ←[31mNoMethodError:←[0m
        ←[31mundefined method `authenticate' for nil:NilClass←[0m
  ←[36m     # ./spec/models/user_spec.rb:124:in `block (4 levels) in <top (require
  d)>'←[0m
  ←[36m     # ./spec/models/user_spec.rb:126:in `block (4 levels) in <top (require
  d)>'←[0m

   9) User return value of authenticate method with invalid password
 ←[31mFailure/Error:←[0m ←[31mlet(:user_for_invalid_password) { found_user.a
 uthenticate("invalid") }←[0m
 ←[31mNoMethodError:←[0m
   ←[31mundefined method `authenticate' for nil:NilClass←[0m
 ←[36m     # ./spec/models/user_spec.rb:124:in `block (4 levels) in <top (require
 d)>'←[0m
 ←[36m     # ./spec/models/user_spec.rb:127:in `block (4 levels) in <top (require
 d)>'←[0m

 Finished in 10.71 seconds
 ←[31m37 examples, 9 failures, 2 pending←[0m

 Failed examples:

 ←[31mrspec ./spec/models/user_spec.rb:31←[0m ←[36m# User ←[0m
 ←[31mrspec ./spec/models/user_spec.rb:60←[0m ←[36m# User when email format is va
 lid should be valid←[0m
 ←[31mrspec ./spec/models/user_spec.rb:112←[0m ←[36m# User with a password that's
 too short ←[0m
 ←[31mrspec ./spec/models/user_spec.rb:99←[0m ←[36m# User return value of authent
 icate method with valid password ←[0m
 ←[31mrspec ./spec/models/user_spec.rb:105←[0m ←[36m# User return value of authen
 ticate method with invalid password ←[0m
 ←[31mrspec ./spec/models/user_spec.rb:106←[0m ←[36m# User return value of authen
 ticate method with invalid password ←[0m
 ←[31mrspec ./spec/models/user_spec.rb:120←[0m ←[36m# User return value of authen
 ticate method with valid password ←[0m
 ←[31mrspec ./spec/models/user_spec.rb:126←[0m ←[36m# User return value of authen
 ticate method with invalid password ←[0m
 ←[31mrspec ./spec/models/user_spec.rb:127←[0m ←[36m# User return value of authen
 ticate method with invalid password ←[0m

这是我的User_spec.rb文件:

 require 'spec_helper'

 describe User do

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

describe "when email addresses 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 "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

describe "with a password that's too short" do
    before { @user.password = @user.password_confirmation = "a" * 5 }
    it { should be_valid }
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.email) }
    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

这是我的问题:

第一&amp;最明显的:

我应该怎么做才能通过这项测试?错误消息没有给我任何线索。

第二

当我创建这样的新用户时:

irb(main):002:0> user = User.create(name: "Example user", email: "User@example>
  ←[1m←[36m (0.0ms)←[0m  ←[1mbegin transaction←[0m
  ←[1m←[35mUser Exists (0.0ms)←[0m  SELECT 1 AS one FROM "users" WHERE LOWER("us
 ers"."email") = LOWER('User@example.com') LIMIT 1
  ←[1m←[36m (0.0ms)←[0m  ←[1mrollback transaction←[0m
=> #<User id: nil, name: "Example user", email: "User@example.com", created_at:
nil, updated_at: nil, password_digest: nil>

然后我尝试保存此用户我得到“错误”响应:

irb(main):004:0> user.save
  ←[1m←[35m (0.0ms)←[0m  begin transaction
  ←[1m←[36mUser Exists (1.0ms)←[0m  ←[1mSELECT 1 AS one FROM "users" WHERE LOWER
  ("users"."email") = LOWER('User@example.com') LIMIT 1←[0m
  ←[1m←[35m (0.0ms)←[0m  rollback transaction
  => false

这个问题是否与开头提到的测试失败有关?

最后一个问题:这是什么意思?

←[32m.←[0m←[32m.←[0m←[33m*←[0m←[31mF←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m
←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m
←[31mF←[0m←[32m.←[0m←[31mF←[0m←[31mF←[0m←[31mF←[0m←[31mF←[0m←[32m.←[0m←[31mF←[0m
←[31mF←[0m←[31mF←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m
←[32m.←[0m←[32m.←[0m←[32m.←[0m←[32m.←[0m←[33m*←[0m

2 个答案:

答案 0 :(得分:1)

BUDDY:请注意下面的代码(这是您的代码)。它来自user_spec.rb。您连续两次复制/粘贴“无效密码”。其他一切都很好你只是在spec文件中输了一个错字。

 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

describe "with a password that's too short" do
    before { @user.password = @user.password_confirmation = "a" * 5 }
    it { should be_valid }
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.email) }
    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

答案 1 :(得分:0)

你的意思是user.rb?

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