2011-06-13 40 views
0

我試圖運行下面的單元測試:Rails的單元測試將不會更新數據庫

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 

然而,它拋出的錯誤在包含「assert_equal」,說1號線:

<#<Usuario ID: 1000003, login: "longbob", hashed_password: "078cf6ae2de80ed6c004c8c8576a5572e077a52c", salt: "1000", nombre: nil, apellido: nil, email: "[email protected]", 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_pa​​ssword每次我重新分配的東西到「密碼」......對吧?

最新情況?

Thx。

UPDATE:我注意到,如果我改變:

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

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

它通過該測試,但是它下面的行失敗... Trowing相同錯誤...這是怎麼回事?

+0

用戶是'Usuario'輸入錯誤還是真的使用2個不同的類?如果是這樣,你能否提供2種方法'驗證'的源代碼。 – 2011-06-13 16:43:16

+0

是一個類型...已經修復 – tiiin4 2011-06-13 16:46:21

+0

您是否檢查「@ longbob.save」是否更新記錄?您可以在保存之後添加一個像'assert_nil Usuario.authenticate(「longbob」,「longtest」)''的測試。 – 2011-06-13 17:00:55

回答

0

我的評論後回答中,我們發現,這個問題是調用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 

如果這個測試失敗了,我會建議你寫的計算器另一個問題了這個bug。

0

您可能會收到驗證錯誤。檢查@longbob.errors的內容。

如果將其分成兩個單獨的語句,會發生什麼情況? (這是很好的做法無論如何)

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

見,#password_confirmation=實際上是一種方法,它可能不會返回傳遞給它,這取決於方法,如何實現價值。

+0

得到了同樣的錯誤: <#>預計但是。 – tiiin4 2011-06-13 16:32:15

0

是否有可能更改密碼變量不會更新數據庫中的hashed_password字段。

你可能需要像這樣在Usuario

before_save :rehash 

def rehash 
    self.hashed_password = ??? #replace ??? with whatever your hashing logic is 
end 
+0

再次檢查我的帖子,我添加了一些東西 – tiiin4 2011-06-13 17:01:06