使用sinon测试promise中的功能

时间:2018-11-22 23:42:17

标签: javascript node.js jestjs sinon

我正在尝试测试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

如果我运行此命令,异步测试块将超时。有人知道我应该如何对此进行评论吗?

谢谢!

1 个答案:

答案 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