Javascript 使用sinon如何存根或伪造回调的属性
使用sinon如何在db.run函数中存根/伪造this.lastID的返回值Javascript 使用sinon如何存根或伪造回调的属性,javascript,node.js,jestjs,sinon,Javascript,Node.js,Jestjs,Sinon,使用sinon如何在db.run函数中存根/伪造this.lastID的返回值 module.exports.insert = async(request) => { //unimportant code return new Promise((resolve, reject) => { db.run(sql, params, function(err) { if (err) reject(err
module.exports.insert = async(request) => {
//unimportant code
return new Promise((resolve, reject) => {
db.run(sql, params, function(err) {
if (err)
reject(err)
else
resolve(this.lastID)
})
})
}
我可以使用以下代码模拟回调:
describe('insert', () => {
beforeEach(() => {
this.insert = sinon.stub(db, 'run')
.callsArgWith(2, null)
})
afterEach(() => {
this.insert.restore()
})
test('add product to the database', async(done) => {
expect.assertions(1)
const id = await productDb.insert(testProductAlt)
expect(isNaN(id)).toBe(false)
expect(id).toBe('1')
done()
})
})
但它将失败,因为this.lastID未定义。我如何克服这个问题
谢谢 您可以使用
stub.callsArgOn()
传入一个上下文值,该值将用作回调中的this
。您可以使用以下内容将其存根:
let insert_stubb = sinon.stub(db, 'run')
.callsArgOn(2, {lastID: 'testVal'})
下面是一个包含一些组合函数的示例:
let db={
运行(sql,params,cb){cb()}
}
let insert=async(请求)=>{
让sql,params
返回新承诺((解决、拒绝)=>{
运行(sql、参数、函数(错误){
如果(错误)
拒绝(错误)
其他的
解析(this.lastID)
})
})
}
让我们插入_stubb=sinon.stub(db,‘run’)
.callsArgOn(2,{lastID:'testVal'})
//应该记录我们的测试值
插入()
.then(console.log)
.catch((e)=>console.log(“错误”,“错误:”,e))
谢谢!非常有用。我试图传入lastID的值,但我使用了.callsArgWith函数,这更有意义。