javascript - 使用 sinon 如何 stub 或伪造回调的属性

标签 javascript node.js jestjs sinon

使用 sinon 如何在 db.run 函数中 stub /伪造 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 的上下文值。你可以用类似的东西来 stub 它:

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>

关于javascript - 使用 sinon 如何 stub 或伪造回调的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53452266/

相关文章:

javascript - worklight 从 mysql 获取图像 blob

javascript - Angular/ typescript : How to resolve this compilation issue?

ruby-on-rails - 在单个 Heroku Cedar 应用程序中同时部署 Rails 和 Node.js

mysql - 用 Jest 模拟 mysql 连接

javascript - 如何以正向和反向方式对数组进行排序Javascript

javascript - 仅将根 URL 重定向到 Firebase 中的某个其他文件

node.js - 值与 bot 和 mysql 数据库的通讯不正确

javascript - Node 计划不适用于express.js

javascript - Firebase 模拟器上的 Firebase 权限被拒绝错误

reactjs - 尝试集成 jest 并与 amchart 使用react,但出现错误。可能是什么问题?