2013-05-08 92 views
-1

我希望有人能幫忙。我正在通過邁克爾哈特的鐵軌教程書,並堅持在chapter 6.3.4。我試圖讓所有的測試來驗證,我不斷收到一些錯誤。我發佈了錯誤消息,並且還發布了我的user.rb和user_spec.rb文件以供參考。 希望有人能看到我出錯的地方。任何幫助將不勝感激。rails教程第二版。第6.3.4章

錯誤

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+\-.][email protected][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: "[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 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[[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 
        @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 

     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  

end

+0

提示:刪除那些< - [31米瞭解更多有關錯誤封郵件:http://linksxplored.blogspot.com /2013/04/rspec-test-gives-32m0m32m0m32m0m32m-in.html – uday 2013-05-08 17:06:06

回答

0

在您的user.rb中,您的驗證語法不正確。

編輯 - 另外,直接檢查你的代碼。他有一個git repository here

  • 看起來你的user_spec與他相比也有一些不同。

取而代之的是:

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 } 
validates :password, presence: true, length: { minimum: 6 } 
validates :password_confirmation, presence: true 

這樣做:

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 } 

validates :password, :presence => true, 
        :length => { :minimum => 6 } 

validates :password_confirmation, :presence => true 
+0

嗨adback,我已經對user.rb文件進行了修改,這仍然給我相同的錯誤信息 – 2013-05-08 14:36:30

+0

檢查我的編輯。我提供了一個鏈接到源代碼來比較你的。 – 2013-05-08 15:08:05

+0

嗨adback,我已經檢查了github的代碼並修改了user_spec.rb文件,這爲我提供了一個解決問題的方法。 – 2013-05-08 16:03:03