我正在尝试测试mysqlite3数据访问层,但似乎无法正确存根db.all()方法,我不确定这是由于数据库的传递方式还是存错了原因
这是我的数据库文件:
layout_height="wrap_content"
这是我想存根的功能:
ScrollView
这是我的尝试,我似乎无法上班:
const db = new sqlite3.Database(path.join(__dirname, '
../database/example.db'), (err) => {
if (err) return console.log(err.message)
console.log('Connected to the database')
})
module.exports.database = db
如果我运行此命令,异步测试块将超时。有人知道我应该如何对此进行评论吗?
谢谢!
答案 0 :(得分:1)
db.all
不返回Promise,它使用回调作为第二个参数。
stub.resolves
导致存根返回Promise,因此从不调用回调,并且selectMultiple
返回的Promise也从不解决,导致测试在await productDb.selectMultiple({ amount: 2 })
上超时。
使用stub.callsArgWith
存根db.all
,以便调用作为第二个参数传递的回调:
describe('select multiple', () => {
beforeEach(() => {
const testProduct2 = JSON.parse(JSON.stringify(testProduct))
testProduct2['key'] = '2'
this.multiple = sinon.stub(db, 'all')
.callsArgWith(1, null, [testProduct, testProduct2]); // use stub.callsArgWith
})
afterEach(() => {
this.multiple.restore()
})
test('select 2 products', async () => {
expect.assertions(2)
const macbooks = await productDb.selectMultiple({ amount: 2 })
expect(macbooks.length === 2).toBe(true) // SUCCESS
expect(macbooks[0].key !== macbooks[1].key).toBe(true) // SUCCESS
})
})
还请注意,您不需要使用done
,因为您正在使用async
测试函数,并且在调用await
时使用了productDb.selectMultiple
。