使用 Jest 的模拟功能

时间:2021-03-25 16:44:11

标签: javascript unit-testing jestjs mocking

我遇到了使用 Jest 模拟函数调用的问题。这是我需要嘲笑的行:

let res = await bot.getUser(userId);

bot 对象通过模块访问,并进行 API 调用以获取用户对象。

我尝试过的事情:

  1. 我用 let userInfo = await getUser(userId, bot); 替换了该行并将上面的逻辑移到该文件中。这是该文件的样子:
export const getUser = async (userId, bot) => {
    let res = await bot.getUser(userId);

    return res;
};

  1. 我关注了 Jest 码头并创建了一个 __mocks__ 文件夹并添加了 getUser.js

  2. /__mocks__/getUser.js 看起来像这样:

export const getUser = () => {
    return Promise.resolve({
        user: { firstName: 'John', lastName: 'Doe' },
    });
};

我的测试(getUser 调用在 handleMessage4Bot 内):

import { handleMessage4Bot } from '../src/handlers/index';

jest.mock('../src/utils/getUser');

const event = { type: 'Message4Bot' };
it('Should return John Doe', async () => {
    let response = await handleMessage4Bot(event);
    expect(response).toBe({
        user: { firstName: 'John', lastName: 'Doe' },
    });
});

Error

当我只测试 getUser 时,它仍然返回 undefined

import getUser from '../getUser';

jest.mock('../getUser');

it('Should return John Doe', async () => {
    let response = await getUser();
    console.log('response :>> ', response);

    expect(response).toStrictEqual({
        user: { firstName: 'John', lastName: 'Doe' },
    });
});

Error 2

2 个答案:

答案 0 :(得分:0)

我能够使用您提供的代码为我工作。我认为您的目录结构或您定义事物的地方可能会搞砸。例如,我注意到您从 getUser 导入 ../src/utils/index; 但您的模拟在 ../src/utils/getUser

我的工作示例:

src/utils/getUser.js

module.exports = async () => {
  return Promise.resolve({
    user: { firstName: 'Jane', lastName: 'Doe' },
  });
};

scr/utils/__tests__/getUserTest.js

const getUser = require('../getUser');

jest.mock('../getUser');

it('Should return John Doe', async () => {
  let response = await getUser();
  console.log('response :>> ', response);
  expect(response).toStrictEqual({
    user: { firstName: 'John', lastName: 'Doe' },
  });
});

src/utils/__mocks__/getUser.js

module.exports = async () => {
  return Promise.resolve({
    user: { firstName: 'John', lastName: 'Doe' },
  });
};

答案 1 :(得分:0)

看起来我的问题是我的 Jest 和 Babel 配置。我通过运行解决了问题:

yarn add --dev babel-jest @babel/core @babel/preset-env      

然后

npx jest --init 或(如果 jest 是全局安装的)jest --init 然后按照说明选择babel