使用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是未定义的。我该如何克服?
谢谢!
答案 0 :(得分:1)
您可以使用stub.callsArgOn()
传递上下文值,该上下文值将在回调中用作this
。您将使用类似以下内容的存根:
let insert_stubb = sinon.stub(db, 'run')
.callsArgOn(2, {lastID: 'testVal'})
这是一个包含一些组合函数的示例:
let db ={
run(sql, params, cb){cb()}
}
let insert = async(request) => {
let sql, params
return new Promise((resolve, reject) => {
db.run(sql, params, function(err) {
if (err)
reject(err)
else
resolve(this.lastID)
})
})
}
let insert_stubb = sinon.stub(db, 'run')
.callsArgOn(2,{lastID: 'testVal'})
// should log our test value
insert()
.then(console.log)
.catch((e) =>console.log("error", "error: ", e))
<script src="https://cdnjs.cloudflare.com/ajax/libs/sinon.js/7.1.1/sinon.min.js"></script>