无法模拟/存根 knex 方法

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

在我的代码中我有类似的内容:

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') 但看起来这是不可能的。

node.js express sinon knex.js sinon-chai
1个回答
0
投票

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 });
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.