使用Sinon的Objection.js存根链接的“ whereIn”方法

时间:2018-06-20 21:38:30

标签: node.js sinon knex.js objection.js

尝试使用Sinon存根链接的knex查询。查询如下所示

const result = await TableModel
  .query()
  .whereIn('id', idList)
  .whereIn('value', valueList);

通常,我使用创建的帮助程序函数来返回模型的实例,每个方法都将其存根以返回this,就像这样

for (const method of ['query', 'whereIn']) {
  TableModel[method] = sandbox.stub().returnsThis();
}

然后将实例存入测试以解决必要的测试用例

TableModel.whereIn = sandbox.stub().resolves({ object: 'stuff' });

但是,当链接相同的方法时,这是行不通的,我从读取的mocha / chai / sinon中得到一个错误

TypeError: TableModel.query(...).whereIn(...).whereIn is not a function

正在寻求有关如何在测试中存根和解决方法的帮助。

2 个答案:

答案 0 :(得分:0)

我一直在尝试处理类似的情况:

await model.query().findById();

我可以通过以下方式对此存根:

const stubbedData = { ... }; // Whatever you want to get

sandbox.stub(Model, 'query').returns({
  findById: sandbox.stub().returns(stubbedData),
});

在您的情况下,这将非常相似,如果您需要区分两个whereIn,则可以使用withArgs或第一个whereIn可以返回另一个“嵌套”存根。

这是一篇有关对复杂对象进行存根的好文章:

https://codeutopia.net/blog/2016/05/23/sinon-js-quick-tip-how-to-stubmock-complex-objects-such-as-dom-objects/

答案 1 :(得分:0)

这是单元测试解决方案,您可以使用stub.withArgs(arg1[, arg2, ...]);解决此问题。

tableModel.js

const TableModel = {
  query() {
    return this;
  },
  async whereIn(field, values) {
    return "real data";
  },
};

module.exports = TableModel;

main.js

const TableModel = require("./tableModel");

async function main(idList, valueList) {
  const result = await TableModel.query()
    .whereIn("id", idList)
    .whereIn("value", valueList);

  return result;
}

module.exports = main;

main.test.js

const main = require("./main");
const TableModel = require("./tableModel");
const sinon = require("sinon");
const { expect } = require("chai");

describe("50957424", () => {
  afterEach(() => {
    sinon.restore();
  });
  it("should pass", async () => {
    sinon.stub(TableModel);
    TableModel.query.returnsThis();
    TableModel.whereIn.withArgs("id").returnsThis();
    TableModel.whereIn.withArgs("value").resolves({ object: "stuff" });
    const actual = await main([1, 2], ["a", "b"]);
    expect(actual).to.be.eql({ object: "stuff" });
    sinon.assert.calledOnce(TableModel.query);
    sinon.assert.calledWith(TableModel.whereIn.firstCall, "id", [1, 2]);
    sinon.assert.calledWith(TableModel.whereIn.secondCall, "value", ["a", "b"]);
  });
});

带有覆盖率报告的单元测试结果:

  50957424
    ✓ should pass


  1 passing (16ms)

---------------|----------|----------|----------|----------|-------------------|
File           |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
---------------|----------|----------|----------|----------|-------------------|
All files      |       92 |      100 |    66.67 |       92 |                   |
 main.js       |      100 |      100 |      100 |      100 |                   |
 main.test.js  |      100 |      100 |      100 |      100 |                   |
 tableModel.js |       50 |      100 |        0 |       50 |               3,6 |
---------------|----------|----------|----------|----------|-------------------|

源代码:https://github.com/mrdulin/mocha-chai-sinon-codelab/tree/master/src/stackoverflow/50957424