0

我将 chai-as-promised 与 sinonjs 结合使用,但我无法弄清楚如何验证更改的密码。

我有类似以下代码的内容:

it('changes password if old password is valid', function(){

    var u = new User({id: '1234567890', email:'user@email.com'});
    var encrypted_password = bcrypt.hashSync('newtestPassword', bcrypt.genSaltSync(8), null);
    sinon.stub(db, 'executeQuery', function() {
        return q.fcall( function() {
            return [ {u: { _data: { data: {flake_id: '1234567890', email:'user@email.com', encrypted_password: encrypted_password}}}}];
        })

    })

    return  u.ChangePassword('testPassword', 'newTestPassword').should
                  .eventually.be.an.instanceof(User)
                  .and.have.property('encrypted_password')
                  .that.satisfy(bcrypt.compareSync('newTestPassword', this));
});

哪里u.ChagePassword()返回一个承诺。

我的问题是断言的最后一行 - 我希望能够从存根数据库响应和用户 bcrypt.compareSync() 中提取加密密码以检查它是否是正确的值,但我不清楚如何参考响应中的 encrypted_pa​​ssword 值。

根据文档,该property()调用使该属性成为断言的主题,这就是我尝试使用this但最终导致 bcrypt 抛出“不正确的参数”错误,我认为这是由于this引用引起的。

有人对如何正确执行此操作有建议吗?

注意:我确实打算用检查查询的模拟替换存根。

4

1 回答 1

1

您遇到的更多是 JavaScript 问题而不是测试问题。您所拥有的与以下内容基本相同:

var result = bcrypt.compareSync('newTestPassword', this);

return u.ChangePassword('testPassword', 'newTestPassword').should
              .eventually.be.an.instanceof(User)
              .and.have.property('encrypted_password')
              .that.satisfy(result);

这应该使问题更清楚。this在您的情况下是mochas 测试函数上下文对象,而不是您的财产。

.satisfy需要一个函数,所以我会这样做:

.that.satisfy(function(hash){
    return bcrypt.compareSync('newTestPassword', hash);
});

或 use .bind,尽管它可能更令人困惑:

.that.satisfy(bcrypt.compareSync.bind(bcrypt, 'newTestPassword'));
于 2015-03-01T02:28:23.387 回答