Неудачный тест в учебнике по ruby ​​(Майкл Хартл) - PullRequest
1 голос
/ 08 декабря 2011

Я изучаю урок Майкла Хартла. Я использую RSPEC для запуска теста. Пока все хорошо, но кажется, что я ударил стену следующим примером.

Вот тест, который не проходит (он должен пройти):

describe "authenticate method" do
  it "should return the user on email/password match" do
    matching_user = User.authenticate(@attr[:email], @attr[:password])
    matching_user.should == @user
  end
end

На всякий случай. @ пользователь определен как:

before(:each) do
  @user = User.create!(@attr)
end

@ attr определяется как:

before(:each) do        
  @attr = {
          :name => "Example user", 
          :email => "user@example.com",
          :password => "foobar",
          :password_confirmation => "foobar"
        }
end

Записи в user.rb

before_save :encrypt_password

def has_password?(submitted_password)
    encrypted_password == encrypt(submitted_password)
end

def self.authenticate(email, submitted_password)
    user = find_by_email(email)
    return nil  if user.nil?
    return user if user.has_password?(submitted_password)
end

private

def encrypt_password 
      self.salt = make_salt unless has_password?(password)
      self.encrypted_password = encrypt(password) 
end

def encrypt(string)
      secure_hash("#{salt}--#{string}")
end

def make_salt
      secure_hash("#{Time.now.utc}--#{password}")
end

def secure_hash(string)
      Digest::SHA2.hexdigest(string)
end

Сообщение об ошибке отображается при сбое теста

c:\RailsInstaller\work\apptwit>rspec spec/models/user_spec.rb
.................F

Failures:

  1) User password validations password encryption authenticate method should return the user on email/password
     Failure/Error: matching_user.should == @user
       expected: #<User id: 1, name: "Example user", email: "user@example.com", created_at: "2011-12-07 19:08:23
ed_at: "2011-12-07 19:08:23", encrypted_password: "fbdbaf712fa1b6c925c4ab2192e73ac9f9d1bedf67630610d68...">
            got: nil (using ==)
     # ./spec/models/user_spec.rb:204:in `block (5 levels) in <top (required)>'

Finished in 221.37 seconds
18 examples, 1 failure

Failed examples:

rspec ./spec/models/user_spec.rb:202 # User password validations password encryption authenticate method should
he user on email/password match

Буду признателен за любые указатели, Большое спасибо.

1 Ответ

1 голос
/ 08 декабря 2011

Если matching_user - ноль, то вы можете поместить несколько puts email и puts user.inspect операторов в self.authenticate для его отладки.

Кажется, что он либо не может найти пользователя по электронной почте, либо ваш пароль по какой-то причине неверен в методе аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...