Node.js 续集模型单元测试
我有一个Node.js 续集模型单元测试,node.js,testing,sequelize.js,sinon,Node.js,Testing,Sequelize.js,Sinon,我有一个Usersequelize模型,它有一个beforeCreate钩子,可以使用bcrypyt加密密码Bcrypyt作为依赖项加载 现在,我正在为我的模型编写测试,我想编写一个测试,确保bcrypt在创建时对密码进行散列 目前,我在User模型中添加了一个setter,用于设置bcrypt对象。在我的测试中,我可以使用sinon创建一个spy,并使用setter注入spy,确保在create时调用它 这是正确的方法吗?我觉得我创建一个setter纯粹是为了我的测试,它没有其他用途。如何测试
User
sequelize模型,它有一个beforeCreate
钩子,可以使用bcrypyt
加密密码<模型使用require
语句将code>Bcrypyt作为依赖项加载
现在,我正在为我的模型编写测试,我想编写一个测试,确保bcrypt
在创建时对密码进行散列
目前,我在User
模型中添加了一个setter,用于设置bcrypt
对象。在我的测试中,我可以使用sinon
创建一个spy,并使用setter注入spy,确保在create时调用它
这是正确的方法吗?我觉得我创建一个setter纯粹是为了我的测试,它没有其他用途。如何测试是开发社区的一个宗教争论点。我的观点是,只要你在测试,到底如何做到这一点是一个偏好的问题。 我倾向于编写尽可能类似于我的应用程序的测试 如果要确保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' )
})
但该测试将使数据库处于脏状态;在测试失败并且由于某种原因无法运行之前,安装和拆卸都是非常可编写脚本的。@Jez
。这更像是一个端到端的测试,确保对象是真正创建的,而不是应用程序是否可用。单元测试应该是快速的,不能访问实际的数据库。