2013-06-03 61 views
0

遵循Michael Hartl rails教程。努力讓記憶標記測試通過,特別是記憶標記的非空白測試。從方法分配到類屬性rails

對於用戶類的代碼是下面

class User < ActiveRecord::Base 
    attr_accessible :name, :email, :password, :password_confirmation 
    has_secure_password 

    before_save { |user| user.email = email.downcase } 
    before_save { :create_remember_token } 


    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 

    private 
    def create_remember_token 
     self.remember_token = SecureRandom.urlsafe_base64 
    end 
end 

和測試我不能得到經過:

subject { @user } 
    ... 
    describe "remember token" do 
    before { @user.save } 
    its (:remember_token) { should_not be_blank } 
    end 

和錯誤消息我得到的是:

.....................F 

Failures: 

    1) User remember token remember_token 
    Failure/Error: its (:remember_token) { should_not be_blank } 
     expected blank? to return false, got true 
    # ./spec/models/user_spec.rb:120:in `block (3 levels) in <top (required)>' 

Finished in 0.68878 seconds 
22 examples, 1 failure 

Failed examples: 

rspec ./spec/models/user_spec.rb:120 # User remember token remember_token 

我不知道這是否相關,但sublime_text沒有對self關鍵字做任何事情(即它沒有突出顯示它以不同的顏色)。

我使用Ruby 1.9.3

+0

很難說。請在運行'rspec ./spec/models/user_spec.rb:120'時發佈log/test.log的輸出 – phoet

回答

2

的問題是,你寫before_save { :create_remember_token }時,你應該有before_save :create_remember_token{ }是一個塊。同樣,當你做

do 
    #This is some code 
end 

這也是一個代碼塊。 這就是爲什麼你的第一個before_save能夠正常工作,因爲你要給該塊執行一段代碼。在第二個before_save中,你只是給它一個具有代碼塊的執行方法的名稱。

TL:DR: 更改

before_save { :create_remember_token } 

before_save :create_remember_token 

,你應該是好去。