Javascript 使用sinon如何存根或伪造回调的属性

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

使用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)
            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函数,这更有意义。