Учебное пособие по Ruby on Rails паролем М. Хартла - PullRequest
2 голосов
/ 11 ноября 2011

Я только начал использовать rails и решил следовать « Ruby on Rails Tutorial » от M. Hartl.Похоже, хорошее вступление.

Я провалил неудачный тест , который сводит меня с ума.Я бегу rails 3.1.1 , с rspec 2.7.0

Я попытался изменить условие, и тесты на метод "has_password" работают.

Неудачный тест:

1) User password encryption authenticate method should return the user on email/password match
Failure/Error: matching_user.should == @user
 expected: #
      got: nil (using ==)
# ./spec/models/user_spec.rb:149:in `block (4 levels) in '

Тест rspec:

describe User do

before(:each) do
@attr = {:name => 'testing', 
         :email =>'testing@example.com',
         :password => "testtest",
         :password_confirmation => "testtest"}
end

...

describe "password encryption" do
  before(:each) do
    @user = User.create!(@attr)
  end

...

describe "authenticate method" do

  it "should exist" do
    User.should respond_to(:authenticate)
  end

  it "should return nil on email/password mismatch" do
    User.authenticate(@attr[:email], "wrongpass").should be_nil
  end

  it "should return nil for an email address with no user" do
    User.authenticate("bar@foo.com", @attr[:password]).should be_nil
  end

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

В модели User:

...

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

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

private

 def encrypt_password
   self.salt = make_salt if new_record?
   self.encrypted_password = encrypt(password)
 end

Я не могу понять, что яя делаю не так здесь.

1 Ответ

1 голос
/ 11 ноября 2011

В вашей неудачной спецификации у вас есть

matching_user.should == @user

Но @user нигде не определено, поэтому установлено в ноль.

Edit:

Попробуйте добавить следующую puts в ошибочную спецификацию и посмотрите, какие результаты вы получите в своей спецификации после ее запуска.

it "should return the user on email/password match" do
  matching_user = User.authenticate(@attr[:email], @attr[:password])
  puts matching_user  # add this
  puts @user          # and also this
  matching_user.should == @user
end      
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...