尝试使用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
正在寻求有关如何在测试中存根和解决方法的帮助。
答案 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
可以返回另一个“嵌套”存根。
这是一篇有关对复杂对象进行存根的好文章:
答案 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