Используя sinon, как мне заглушить или подделать свойство обратного вызова - PullRequest
0 голосов
/ 23 ноября 2018

Используя sinon, как мне заглушить / подделать возвращаемое значение this.lastID в функции db.run.

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 не определен.Как мне преодолеть это?

Спасибо!

1 Ответ

0 голосов
/ 23 ноября 2018

Вы можете использовать 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>
...