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
。这更像是一个端到端的测试,确保对象是真正创建的,而不是应用程序是否可用。单元测试应该是快速的,不能访问实际的数据库。