0

遵循 Michael Hartl rails 教程。努力让记忆令牌测试通过,特别是记忆令牌的非空白测试。

User 类的代码如下

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+\-.]+@[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

4

1 回答 1

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 

你应该很高兴。

于 2013-06-03T23:46:39.140 回答