通过使用 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
在你的例子中是 mocha
s 测试函数上下文对象,而不是你的 属性。
.satisfy
需要一个函数,所以我会做:
.that.satisfy(function(hash){
return bcrypt.compareSync('newTestPassword', hash);
});
或使用.bind
,尽管它可能更令人困惑:
.that.satisfy(bcrypt.compareSync.bind(bcrypt, 'newTestPassword'));
我正在将 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
在你的例子中是 mocha
s 测试函数上下文对象,而不是你的 属性。
.satisfy
需要一个函数,所以我会做:
.that.satisfy(function(hash){
return bcrypt.compareSync('newTestPassword', hash);
});
或使用.bind
,尽管它可能更令人困惑:
.that.satisfy(bcrypt.compareSync.bind(bcrypt, 'newTestPassword'));