【问题标题】:Sequelize Model Unit TestSequelize 模型单元测试
【发布时间】:2015-06-24 04:53:47
【问题描述】:

我有一个User sequelize 模型,它有一个beforeCreate 钩子,它使用bcrypyt 加密密码。模型使用require 语句将Bcrypyt 作为依赖项加载。

现在,我正在为我的模型编写测试,并且我想编写一个测试以确保 bcrypt 在创建时对密码进行哈希处理。

目前,我在 User 模型上添加了一个设置器,用于设置 bcrypt 对象。在我的测试中,我可以使用 sinon 创建一个间谍,并使用 setter 注入间谍并确保在创建时调用它。

这是正确的方法吗?我觉得我创建一个 setter 纯粹是为了我的测试,它没有其他用途。

【问题讨论】:

    标签: node.js testing sequelize.js sinon


    【解决方案1】:

    如何测试是开发社区中的一个宗教争论点。我认为,只要您进行测试,具体如何完成是一个偏好问题。 我倾向于编写尽可能像我的应用程序一样的测试。

    如果您想确保 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 And the setup and teardown is very scriptable
    • 直到测试失败并且由于某种原因无法运行拆卸。
    • 这更像是一个端到端的测试,确保对象是真正创建的,而不是它是否对应用程序可用。单元测试应该很快并且不访问实际的数据库。
    • 这不是单元测试!您正在连接到require('/.User');中的数据库@
    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 2017-12-19
    • 2010-12-26
    • 1970-01-01
    • 2015-06-25
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多