如何使用sinnon模拟书架js中的回调函数

问题描述 投票:0回答:1

[我想用sinon使用书架js(带knex)来模拟这段代码。

  const campaigns = await models.Campaign.forge()
    .query((qb) => {
      qb.where("account_id", accountId)
      qb.andWhere("status", models.Campaign.STATUS.ACTIVE)
      qb.andWhere("audience_create_trigger", models.Campaign.AUDIENCE_CREATE_TRIGGER.ON_ENTER)
    })
    .fetchAll()

我如何在.query函数中模拟内部查询。我有点迷路

非常感谢!

javascript sinon knex.js bookshelf.js
1个回答
0
投票

我终于使用Sinon解决了这个问题。该代码涵盖了几乎所有行为

const assert = require("chai").assert
const sinon = require("sinon")
const models = require("../../../../models")


const query = {
    query(func) {}
}
const qb = {
    where(arg1, arg2) {},
    andWhere(arg1, arg2) {}
}
const fetchAll = { async fetchAll() {} }

const forgeStub = sinon.stub(models.Campaign, "forge").returns(query)
const qbWhereStub = sinon
      .stub(qb, "where")
      .withArgs("account_id", accountId)
      .returns(null)
const qbAndWhereStub = sinon.stub(qb, "andWhere").returns(null)
const queryStub = sandbox
      .stub(query, "query")
      .callsArgWith(0, qb)
      .returns(fetchAll)
const fetchAllStub = sandbox.stub(fetchAll, "fetchAll").returns(campaigs)

//Calling the method

//Verify
assert.equal(qbWhereStub.callCount, 1)
assert.equal(qbAndWhereStub.callCount, 2)
assert.equal(forgeStub.callCount, 1)
assert.equal(queryStub.callCount, 1)
assert.equal(fetchAllStub.callCount, 1)
assert.isTrue(qbWhereStub.getCall(0).calledWithExactly("account_id", accountId))
assert.isTrue(qbAndWhereStub.getCall(0).calledWithExactly("status", models.Campaign.STATUS.ACTIVE))
assert.isTrue(
  qbAndWhereStub
   .getCall(1)
   .calledWithExactly("audience_create_trigger", models.Campaign.AUDIENCE_CREATE_TRIGGER.ON_ENTER)
)
© www.soinside.com 2019 - 2024. All rights reserved.