2015-04-17 70 views
3

我有一個User續集模型,它有一個beforeCreate掛鉤,它使用bcrypyt加密密碼。 Bcrypyt被模型使用require語句作爲依賴項加載。續編模型單元測試

現在,我正在爲我的模型編寫我的測試,並且我想編寫一個測試以確保bcrypt在創建時散列密碼。

目前,我在User模型中添加了一個setter,該模型設置了bcrypt對象。在我的測試中,我可以使用sinon創建一個間諜,並使用setter注入間諜,並確保它在創建時被調用。

這是正確的方法嗎?我覺得我正在爲我的測試純粹創造一個二傳手,並且它沒有其他目的。

回答

6

如何測試是發展社區中的一個宗教辯論點。我認爲,只要你測試,究竟如何完成是一個偏好問題。 我傾向於編寫儘可能像我的應用程序一樣行爲的測試。

如果您想要確保bcrypt在創建時正確散列用戶密碼,請創建一個用戶並保存並檢查密碼。

這可以更多的工作與確保測試數據庫運行的測試,但我覺得它提供了很好的結果。安裝和拆卸非常容易編寫腳本。

對於本示例,您甚至不需要測試框架來測試此行爲。

var User = require('./User') 
var BCRYPT_HASH_BEGINNING = '$2a$' 
var TEST_PASSWORD = 'hello there' 

User.create({ password: TEST_PASSWORD }).then(function(user){ 
    if(!user) throw new Error('User is null') 
    if(!user.password) throw new Error('Password was not saved') 
    if(user.password === TEST_PASSWORD) 
    throw new Error('Password is plaintext') 
    if(user.password.indexOf(BCRYPT_HASH_BEGINNING) === -1) 
    throw new Error('Password was not encrypted') 
}) 
+0

除了該測試將使您的數據庫處於骯髒狀態;之後你不清理。 – Jez

+1

@Jez'安裝和拆卸非常容易編寫代碼' – JoshWillik

+1

直到測試失敗並且拆卸由於某種原因無法運行。 – Jez