【问题标题】:Jest, How to mock an imported callback in Object Destructuring?开玩笑,如何在对象解构中模拟导入的回调?
【发布时间】:2022-01-22 11:32:10
【问题描述】:

我按以下方式进行了测试,但它困扰着我如何需要导入具有函数的对象,而不仅仅是导入函数。

这行得通

//service.test.js
const get = require('../../modules/bankUser/model/getRegisteredUser');

    get.getRegisteredUser = jest.fn()
      .mockImplementationOnce(async () => mock)
      .mockImplementationOnce(async () => mockUpdated);

//service.js
const get = require('../model/getRegisteredUser');

const testedFunction () => {
  const depositReciver = await get.getRegisteredUser(depositName, depositCpf);
}

这个剂量

//service.test.js
const get = require('../../modules/bankUser/model/getRegisteredUser');

    get.getRegisteredUser = jest.fn()
      .mockImplementationOnce(async () => mock)
      .mockImplementationOnce(async () => mockUpdated);

//service.js
const { getRegisteredUser } = require('../model/getRegisteredUser');

const testedFunction () => {
  const depositReciver = await getRegisteredUser(depositName, depositCpf);
}

我正在尝试这个 (way):

//service.test.js
const get = require('../../modules/bankUser/model/getRegisteredUser');

    jest.mock('../../modules/bankUser/model/getRegisteredUser');
    get.mockImplementationOnce(() => ({ getRegisteredUser: () => mockObject }));

jest 返回这个:

TypeError: get.mockImplementationOnce is not a function

我也试过这样导入

//service.test.js
const { getRegisteredUser } = require('../../modules/bankUser/model/getRegisteredUser');

    jest.mock('../../modules/bankUser/model/getRegisteredUser');
    getRegisteredUser.mockImplementationOnce(() => ({ getRegisteredUser: () => mockObject }));

编辑

//getRegisteredUser.js
const { getConnection } = require('../../../global/connection');

const getRegisteredUser = async (userName, cpf) => {
  const db = await getConnection('Data-Base');
  const res = await db.collection('Collection')
    .findOne({ userName, cpf });
  return res;
};

module.exports = { getRegisteredUser };

【问题讨论】:

  • 我认为您需要在导入模块之前调用jest.mock。是的,解构会提早绑定东西,这会使模拟变得复杂。

标签: javascript unit-testing jestjs


【解决方案1】:

您指向的示例 [https://jestjs.io/docs/es6-class-mocks#replacing-the-mock-using-mockimplementation-or-mockimplementationonce][1] 与默认导出有关,但我认为您在代码中使用了命名导出。

有多种方法可以做到这一点

一种方式

const get = require('../../modules/bankUser/model/getRegisteredUser');

jest.mock('../../modules/bankUser/model/getRegisteredUser');
get.getRegisteredUser.mockImplementationOnce(() => mockObject);

第二种方式

jest.mock('../../modules/bankUser/model/getRegisteredUser', () => ({
  ...jest.requireActual('../../modules/bankUser/model/getRegisteredUser'),
  getRegisteredUser: jest.fn().mockImplementation(() => mockObject),
}))

另一种方式

We can also mock a module using the __mocks__ directory which is inbuilt feature of jest

最后永远不要忘记在每次测试后调用 clearAllMocks() 否则它可能会影响其他测试的输出。

afterEach(() => {
  jest.clearAllMocks();
});

【讨论】:

  • 我想我错过了一些东西。甚至可以像这样导入吗? ` const { getRegisteredUser } = require('../model/getRegisteredUser');常量测试函数 () => { 常量 depositReciver = await getRegisteredUser(depositName, depositCpf); } `我已经尝试过第一种和第二种方法,但都没有奏效。
  • 这取决于您如何导出模块的功能。如果是在exports.getRegisteredUser= () => { return 'ank'; };或在 module.exports = { getRegisteredUser: () => { return 'ank'; }, };然后格式化 const { getRegisteredUser } = require('../model/getRegisteredUser');语法很好。您能否分享更多代码以更好地理解?
  • 我已经编辑了帖子。如果我在 service.js ```const get = require('../model/getRegisteredUser'); ``` 上这样导入它们,这两种方法都有效
  • 您需要使用命令 npm -v 检查您的 npm 版本。如果它是 V8 或更低版本,则此语法将不起作用,因为 ES6 解构尚未在我们在节点 v4 中拥有的 V8 版本中提供。但是,如果您运行带有标志 --harmony-destructuring 的节点命令或测试命令,您可以使您的代码工作,例如:“npm run test service.test.js --harmony-destructuring”
猜你喜欢
  • 2020-05-27
  • 2020-08-20
  • 2019-11-04
  • 2022-10-24
  • 2022-12-24
  • 2018-05-05
  • 2018-12-30
  • 2021-07-03
  • 2018-10-23
相关资源
最近更新 更多