2015-04-17 65 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