我有一个User
续集模型,它有一个beforeCreate
挂钩,使用bcrypyt
加密密码。 Bcrypyt
由模型使用require
语句加载为依赖项。
现在,我正在为我的模型编写测试,我想编写一个测试,确保bcrypt
在创建时隐藏密码。
目前,我已在设置User
对象的bcrypt
模型上添加了一个setter。在我的测试中,我可以使用sinon
创建一个间谍,并使用setter注入间谍并确保在创建时调用它。
这是正确的方法吗?我觉得好像我正在为我的测试创建一个二传手,而且它没有任何其他目的。
答案 0 :(得分: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' )
})