Javascript 如何使用sinon正确地存根和测试函数
我有一个基本的方法,它接受cookie并返回一个有效的用户Javascript 如何使用sinon正确地存根和测试函数,javascript,node.js,mocha.js,sinon,Javascript,Node.js,Mocha.js,Sinon,我有一个基本的方法,它接受cookie并返回一个有效的用户 const getInitialState = (id_token) => { let initialState; return new Promise((resolve,reject) => { if(id_token == null){ initialState = {userDetails:{username: 'Anonymous',isAuthenticated: false}}
const getInitialState = (id_token) => {
let initialState;
return new Promise((resolve,reject) => {
if(id_token == null){
initialState = {userDetails:{username: 'Anonymous',isAuthenticated: false}}
resolve(initialState)
}else{
var decoded = jwt.verify(JSON.parse(id_token),'rush2112')
db.one('SELECT * FROM account WHERE account_id = $1',decoded.account_id)
.then(function(result){
initialState = {userDetails:{username:result.username,isAuthenticated:true}}
resolve(initialState)
})
.catch(function(err){
console.log('There was something wrong with the token')
reject('There was an error parsing the token')
})
}
})
}
因为这是一个承诺-我用的是一个承诺
我能够用以下方法成功测试第一个条件(cookie未预设)
it('should return anonymous user if id_token isnt preset',function(){
let id_token = null
return expect(getInitialState(id_token)).to.eventually.have.deep.property('userDetails.username','Anonymous')
})
但是,我不能/不太确定如何测试第二部分,因为它同时依赖于jwt和外部db调用(它本身是另一个promise对象)
到目前为止我已经试过了。中断db调用会返回这个错误,我发现这个错误非常模糊
1) GetInitialState should return a valid user if id_token is valid:
TypeError: Cannot redefine property: connect
at Function.defineProperty (native)
at Object.wrapMethod (node_modules/sinon/lib/sinon/util/core.js:128:24)
at stub (node_modules/sinon/lib/sinon/stub.js:67:26)
at node_modules/sinon/lib/sinon/stub.js:60:25
at node_modules/sinon/lib/sinon/walk.js:28:30
at Array.forEach (native)
at walkInternal (node_modules/sinon/lib/sinon/walk.js:23:45)
at Object.walk (node_modules/sinon/lib/sinon/walk.js:49:20)
at Object.stub (node_modules/sinon/lib/sinon/stub.js:52:23)
at Context.<anonymous> (getInitialState.spec.js:27:11)
应该是
sinon.stub(db, 'one').resolves();
您需要超越某些pg承诺,默认为超越特定方法 特别设置noLocking=true
const pgp = require('pg-promise')({noLocking:true})
更新
来自作者。这是正确的方法。见选项:
如果此规定妨碍了在测试中使用模拟框架,则可以通过在选项中设置noLocking=true来强制库停用大部分锁
我试过了。。但是我得到了下面的错误
TypeError:cannotredefinitionproperty:one
您是如何得到db
?您提供的源代码中没有定义DB是从pg promise
库初始化的数据库连接器const db=pgp(cn)
其中cn为,对象的用户名/密码为db等
const pgp = require('pg-promise')({noLocking:true})