Rails Unit Testing не будет обновлять базу данных - PullRequest
0 голосов
/ 13 июня 2011

Я пытаюсь запустить следующий юнит-тест:

def test_passwordchange
    # check success
    assert_equal @longbob, Usuario.autenticar("longbob", "longtest")
    #change password
    @longbob.password = "nonbobpasswd"
    @longbob.password_confirmation = "nonbobpasswd"

    assert @longbob.save!
    #new password works
    assert_equal @longbob, Usuario.autenticar("longbob", "nonbobpasswd")
    #old pasword doesn't work anymore
    assert_nil   Usuario.autenticar("longbob", "longtest")
    #change back again
    @longbob.password = "longtest"
    @longbob.password_confirmation = "longtest"
    assert @longbob.save!
    assert_equal @longbob, Usuario.autenticar("longbob", "longtest")
    assert_nil   Usuario.autenticar("longbob", "nonbobpasswd")
  end

Тем не менее, он выдает ошибку в 1-й строке, содержащей "assert_equal", который говорит:

<#<Usuario ID: 1000003, login: "longbob", hashed_password: "078cf6ae2de80ed6c004c8c8576a5572e077a52c", salt: "1000", nombre: nil, apellido: nil, email: "lbob@mcbob.com", telefono: nil, tipo_usuario: nil, foto: nil, bol_activo: nil>> expected but was <nil>.

Вот мой метод аутентификации:

def self.authenticate (login, pass)
    u=find(:first, :conditions=>["login = ?", login])
    return nil if u.nil?
    return u if Usuario.encrypt(pass, u.salt)==u.hashed_password
    nil
  end

Кроме того, я определил следующее:

def password=(pass)
    @password=pass
    self.salt = Usuario.random_string(10) if !self.salt?
    self.hashed_password = Usuario.encrypt(@password, self.salt)
  end

Итак, я думаю, что это должно обновлять hashed_password каждый раз, когда я переназначаю что-то на «пароль» ..Да?

Что происходит?

Спасибо.

ОБНОВЛЕНИЕ: Я заметил, что если я изменюсь:

assert_equal @ longbob , Usuario.autenticar ("longbob", "nonbobpasswd")

до

assert_equal @ longbob2 , Usuario.autenticar ("longbob", "nonbobpasswd")

Он проходит этот тест, но не проходит в следующей строке ... Выдает ту же ошибку ...Что с этим?

Ответы [ 3 ]

0 голосов
/ 13 июня 2011

Возможно ли, что изменение переменных пароля не обновит поле hashed_password в базе данных.

Возможно, вам нужно что-то подобное в Usuario:

before_save :rehash

def rehash
   self.hashed_password = ??? #replace ??? with whatever your hashing logic is
end
0 голосов
/ 13 июня 2011

Чтобы ответить после моего комментария, мы узнаем, что проблема в том, что вызов save не обновляет запись в базе данных. Я предложил вам написать еще один тест, чтобы увидеть это поведение и исправить его, тест, который вы написали, начинает быть слишком длинным, и на самом деле ошибка не имеет ничего общего с механизмом аутентификации.

Вот тест, который я бы написал:

def test_change_password_save
  old_hash = @longbob.hashed_password
  @longbob.password = "nonbobpasswd"
  @longbob.password_confirmation = "nonbobpasswd"
  @longbob.save
  assert_not_equal(old_hash, @longbox.reload.hashed_password)
end

Если этот тест не пройден, я бы предложил вам написать еще один вопрос в stackoverflow для этой ошибки.

0 голосов
/ 13 июня 2011

Возможно, вы получили ошибку проверки.Проверьте содержимое @longbob.errors.

Что произойдет, если вы разделите это на два отдельных оператора?(В любом случае, это хорошая практика)

@longbob.password = @longbob.password_confirmation = "nonbobpasswd"

Видите, #password_confirmation= на самом деле является методом, который может не возвращать значение, которое ему было передано, в зависимости от того, как метод был реализован.

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