通过使用 chai-as-promised 的函数调用验证已解决承诺的内容

verifying contents of a resolved promise via function call with chai-as-promised

我正在将 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() returns 一个承诺。

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

根据文档,property() 调用使 属性 成为断言的主题,这就是我尝试使用 this 但最终 bcrypt 抛出 'Incorrect arguments' 错误,我认为是由于 this 参考。

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

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

您遇到的 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);
});

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

.that.satisfy(bcrypt.compareSync.bind(bcrypt, 'newTestPassword'));