在我的代码中我有类似的内容:
const getItem = async (itemId) => {
const item = await knex('item').where('id', itemId).first();
console.log(item);
};
在我的测试文件上:
sinon.stub(knex, 'first').resolves({ id: 1 });
knex 导入为
const knex = require('Knex')(config)
。
我觉得 knex('table_name') 创建了一个不同的实例,并且方法没有被嘲笑。
更新 存根只能这样工作:
const knexStub = sinon.stub(knex, 'from').callsFake(() => ({
where: () => ({
first: () => null
}),
insert: () => sinon.fake()
}));
然后在我的函数中:
const getItem = async (itemId) => {
const item = await knex.from('item').where('id', itemId).first();
console.log(item);
};
我更喜欢 knex('table_name') 但看起来这是不可能的。
sinon不支持stub独立功能,我们需要使用proxyquire包。
getItem.js
:
const knex = require("knex")({
client: "mysql",
connection: {
host: "127.0.0.1",
port: 3306,
user: "your_database_user",
password: "your_database_password",
database: "myapp_test",
},
});
const getItem = async (itemId) => {
return knex("item")
.where("id", itemId)
.first();
};
module.exports = getItem;
getItem.test.js
:
const proxyquire = require("proxyquire");
const sinon = require("sinon");
describe("77622992", () => {
it("should pass", async () => {
const knexClient = sinon.stub().returns({
where: sinon.stub().returnsThis(),
first: sinon.stub().resolves({ id: 1 }),
});
const knexStub = sinon.stub().returns(knexClient);
const getItem = proxyquire("./getItem", {
knex: knexStub,
});
const r = await getItem(1);
sinon.assert.match(r, { id: 1 });
});
});